C/S架构学习之基于TCP的本地通信(服务器)

编程入门 行业动态 更新时间:2024-10-26 13:25:03

C/S<a href=https://www.elefans.com/category/jswz/34/1771112.html style=架构学习之基于TCP的本地通信(服务器)"/>

C/S架构学习之基于TCP的本地通信(服务器)

  • 基于TCP的本地通信(服务器):
  • 创建流程:
  • 一、创建字节流式套接字(socket函数):
	int sock_fd = socket(AF_LOCAL,SOCK_STREAM,0);
  • 二、创建服务器和客户机的本地网络信息结构体并填充服务器本地网络信息结构体 (struct sockaddr_un):
  • 本地网络信息结构体:
	#include <sys/un.h>struct sockaddr_un {sa_family_t sun_family;               //AF_LOCALchar        sun_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 <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/ip.h>#include <sys/un.h>#include <arpa/inet.h>#include <stdbool.h>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!!!]

更多推荐

C/S架构学习之基于TCP的本地通信(服务器)

本文发布于:2023-11-15 11:51:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1599132.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:架构   通信   服务器   TCP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!