• 基于TCP的本地通信(服务器):
  • 创建流程:
  • 一、创建字节流式套接字(socket函数):
int sock_fd = socket(AF_LOCAL,SOCK_STREAM,0);
  • 二、创建服务器和客户机的本地网络信息结构体并填充服务器本地网络信息结构体 (struct sockaddr_un):
  • 本地网络信息结构体:
#include struct sockaddr_un {sa_family_t sun_family; //AF_LOCALcharsun_path[108];//pathname};
//填充服务器和客户机网络信息结构体struct sockaddr_un serveraddr,clientaddr;socklen_t serveraddr_len = sizeof(serveraddr);socklen_t clientaddr_len = sizeof(clientaddr);memset(&serveraddr,0,serveraddr_len);memset(&clientaddr,0,clientaddr_len);serveraddr.sun_family = AF_LOCAL;strcpy(serveraddr.sun_path,"./tcpserver");
  • 三、绑定字节流式套接字(bind函数):
bind(sock_fd,(struct sockaddr *)&serveraddr,serveraddr_len);
  • 四、设置套接字为被监听状态(listen函数):
listen(sock_fd,5);
  • 五、阻塞等待客户端连接(accept函数):
accept(sock_fd,(struct sockaddr *)&clientaddr,&clientaddr_len);
  • 六、服务器端收发数据(recv函数、send函数):
memset(buf,0,sizeof(buf));if(-1 == (nbytes = recv(accept_fd,buf,sizeof(buf),0))){perror("recv error");exit(-1);}else if(0 == nbytes){printf("客户端[%s]断开了连接\n",clientaddr.sun_path);break;}printf("客户端[%s]发来数据[%s]\n",clientaddr.sun_path,buf);//组装应答消息strcat(buf,"-------k");ret = send(accept_fd,buf,sizeof(buf),0);if(-1 == ret){perror("send error");exit(-1);}
  • 七、关闭套接字(close函数):
close(accept_fd);close(sock_fd);
  • 示例代码:
#include #include #include #include #include #include #include #include #include #include int main(int argc, char const *argv[]){//创建套接字int sock_fd = socket(AF_LOCAL,SOCK_STREAM,0);if(-1 == sock_fd){perror("socket error");exit(-1);}//填充服务器和客户机网络信息结构体struct sockaddr_un serveraddr,clientaddr;socklen_t serveraddr_len = sizeof(serveraddr);socklen_t clientaddr_len = sizeof(clientaddr);memset(&serveraddr,0,serveraddr_len);memset(&clientaddr,0,clientaddr_len);serveraddr.sun_family = AF_LOCAL;strcpy(serveraddr.sun_path,"./tcpserver");//服务器绑定套接字if(-1 == bind(sock_fd,(struct sockaddr *)&serveraddr,serveraddr_len)){perror("bind error");exit(-1);}//设置监听状态if(-1 == listen(sock_fd,5)){perror("listen error");exit(-1);}//阻塞等待客户端连接int accept_fd = 0;char buf[128] = {0};int nbytes = 0;int ret = 0;//提示信息printf("本地通信之TCP服务器启动!!!\n");while(true){ accept_fd = accept(sock_fd,(struct sockaddr *)&clientaddr,&clientaddr_len);if(-1 == accept_fd){perror("accept error");exit(-1);}//收发数据while(true){memset(buf,0,sizeof(buf));if(-1 == (nbytes = recv(accept_fd,buf,sizeof(buf),0))){perror("recv error");exit(-1);}else if(0 == nbytes){printf("客户端[%s]断开了连接\n",clientaddr.sun_path);break;}printf("客户端[%s]发来数据[%s]\n",clientaddr.sun_path,buf);//组装应答消息strcat(buf,"-------k");ret = send(accept_fd,buf,sizeof(buf),0);if(-1 == ret){perror("send error");exit(-1);}}close(accept_fd);}//关闭套接字close(sock_fd);return 0;}
  • 运行结果:
本地通信之TCP服务器启动!!!客户端[./tcpclient]发来数据[hello]客户端[./tcpclient]发来数据[hi]客户端[./tcpclient]发来数据[I Love China!!!]
  • 特别注意:
  • strcpy(serveraddr.sun_path,"./tcpserver");tcpserver文件套接字文件
  • 如下所示:
srwxrwxr-x 1 linux linux 0 1110 05:58 tcpserver