小白初学简单阻塞式socket编程 linux c编程

本文介绍了如何使用C语言在Linux环境下进行简单的阻塞式socket编程,包括服务器端和客户端的实现。服务器端通过socket、bind、listen和accept创建并监听端口,等待客户端连接。当客户端通过socket、connect与服务器建立连接后,服务器发送消息,客户端接收并打印。整个过程详细展示了本地进程间及局域网通信的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近第一次学习了socket编程 本地进程间通信和利用局域网来通信都了解了一点 这次主要写的是通过局域网来通信
首先 服务器端代码
头文件:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>//以上三个为标准c语言函数,这里不多加赘述
#include<unistd.h>//linux c编程时用库函数要加的头文件 类比于windows.h 可以使用Unix操作系统库里的东西
#include<sys/types.h>//包含编程时需要用到的一些数据类型
#include<sys/socket.h>//socket编程时要用的头文件
#include<sys/un.h>//Internet 协议族
#include<arpa/inet.h>//包含ip地址由本地字序转换到网络字序(大端?)时要用到的函数
定义变量:
int server_fd,client_fd;//通信用的套接字
struct sockaddr_in myaddr;//socket编程时 若是局域网通信 用到的一种结构体
struct sockaddr_in client_addr;
myaddr.sin_family=AF_INET;//结构体中包含的内容之一 所用的通信协议  
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);之二 允许连接的ip INADDR_ANY表示允许任意ip地址连接
myaddr.sin_port=htons(8080);//之三 使用的端口号
int clientlen=sizeof(client_addr);
以下是创建连接的过程
//1.socket
server_fd=socket(AF_INET,SOCK_STREAM,0);
if(server_fd==-1)
{
    perror("socket error");
    exit(-1);
}
//2.bind
if((bind(server_fd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
{
    perror("bind error");
    exit(-1);
}
//3.listen
if(listen(server_fd,5)==-1)
{
    perror("listen error");
    exit(-1);
}
printf("listening...\n");
//4.accept
client_fd=accept(server_fd,(struct sockaddr *)&client_addr,&clientlen);//创建一个新的套接字  原来那个仍用于监听端口 这个用于发送接收消息
if(client_fd==-1)
{
   perror("accept error");
   exit(-1);
}
//5.op
send(client_fd,"hi i'm kid",11,0);
printf("write to client\n");
//6.close
close(server_fd);
close(client_fd);
}
客户端代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main()
{
     int server_fd;
     struct sockaddr_in myaddr;
     myaddr.sin_family=AF_INET;
     myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");//将点制ip转化成32位长整形整数
     myaddr.port=htonl(8080);
     char buf[100];
     server_fd=socket(AF_INET,SOCK_STREAM,0);
     if(server_fd==-1)
     {
         perror("socket error");
         exit(-1);
     }
     if((connect(server_fd,(struct sockaddr *)&myaddr,sizeof(myaddr)))==-1)
     {
         perror("connect error");
         exit(-1);
     }
     recv(server_fd,buf,100,0);
     printf("%s\n",buf);
     close(server_fd);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值