Linux TCP通信例子
TCP通信的C/S模型
///server.c #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #define PORT 4321 #define BUFFER_SIZE 1024 #define MAX 5 #include <pthread.h> int main() { struct sockaddr_in servaddr; int sockfd,client_fd; char buf[BUFFER_SIZE]; /*建立socket连接*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(1); } printf("socket id=%d\n",sockfd); /*设置sockaddr_in结构体中相关参数*/ bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(PORT); servaddr.sin_addr.s_addr=INADDR_ANY; int i=1; /*允许重复使用本地址与套接字进行绑定*/ setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i)); /*绑定函数bind()*/ if(bind(sockfd,(struct sockaddr *) &servaddr,sizeof(servaddr))==-1) { perror("bind"); exit(1); } printf("Bind success!\n"); /*调用listen函数,创建未处理请求的队列*/ if(listen(sockfd,MAX)==-1) { perror("listen"); exit(1); } printf("Listen...\n"); /*调用accept函数,等待客户端连接*/ if((client_fd=accept(sockfd,NULL,NULL))==-1) { perror("accept"); exit(0); } /*调用recv()函数接收客户端的请求*/ memset(buf,0,sizeof(buf)); if(recv(client_fd,buf,BUFFER_SIZE,0)==-1) { perror("recv"); exit(0); } printf("Received a message:%s\n",buf); close(sockfd); exit(0); }
///client.c /* TCP通讯的client端; */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include<arpa/inet.h> #define BUFFER_SIZE 100 int main(int argc,char *argv[]) { int sockfd,client_fd; char buf[BUFFER_SIZE]; struct sockaddr_in servaddr; if(argc<3) { printf("USAGE=%s <serv_in> <serv_port>\n",argv[0]); exit(-1); } // memset(buf,0,sizeof(buf)); /*创建socket*/ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(-1); } /*创建sockaddr_in结构体中相关参数*/ bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(atoi(argv[2])); servaddr.sin_addr.s_addr= inet_addr(argv[1]); /*调用connect函数主动发起对服务端的链接*/ if(connect(sockfd,(struct sockaddr *) &servaddr,sizeof(servaddr))==-1) { perror("connect"); exit(-1); } /*发送消息给服务端*/ while(1) { scanf("%s",buf); if(send(sockfd,buf,strlen(buf),0)==-1) { perror("send"); exit(-1); } memset(buf,0,sizeof(buf)); if(recv(client_fd,buf,BUFFER_SIZE,0)==-1) { perror("recv"); exit(0); } printf("Received a message:%s\n",buf); } close(sockfd); exit(0); }
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· golang中写个字符串遍历谁不会?且看我如何提升 50 倍
· C# 代码如何影响 CPU 缓存速度?
· 智能桌面机器人:使用 .NET 为树莓派开发 Wifi 配网功能
· C# 模式匹配全解:原理、用法与易错点
· 记一次SSD性能瓶颈排查之路——寿命与性能之间的取舍
· 时隔半年,拾笔分享:来自一个大龄程序员的迷茫自问
· C#-Visual Studio工具使用实践
· 《程序员的底层思维》读后感
· WineHQ 发布的 Framework Mono 6.14 的这个特性对Windows Form
· 不写一行代码 .NET 使用 FluentCMS 快速构建现代化内容管理系统(CMS)