当前位置: 首页 > news >正文

linux中TCP通信

客户端的代码

//TCP通信的服务端 #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> int main() { //1 创建监听的套接字 int sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd==-1) { perror("sokcfd"); exit(-1); } //2 把fd,ip,port进行绑定 strcut sockaddr_in saddr; //socket地址结构体 saddr.sin_familly=AF_INET; //inet_pton(AF_INET,"192.168.68.128",saddr.sin_addr.s_addr); //将主机字节序转化为网络字节序 saddr.sin_addr.s_addr=0; saddr.sin_port=htons (9999); int ret=bind(sockfd,(struct sockaddr *)&saddr,sizeof(saddr)); if(ret==-1) { perror("bind"); exit(-1); } //3 监听 ret=listen(sockfd,8); if(ret==-1) { perror("listen"); exit(-1); } //4 接受客户端的连接,如果没有客服端请求连接那么默认是堵塞的 strcut sockaddr_in clientaddr; //socket地址结构体 socklen_t size=sizeof(clientaddr); int cfd=accept(sockfd,(struct sockaddr *)&clientaddr,&size); if(cfd==-1) { perror("accept"); exit(-1); } //输出客户端的信息(获取到的信息是网络字节序,需要进行一个十分制转换 char clientIP[16]; inet_ntop(AF_INET,clientaddr.sin_addr.s_addr,clientIP,sizeof(clientIP)); unsigned short clientport=ntohs(clientaddr.sin_port); printf("client IP is: %s ,client port is: %d\n",clientIP,clientport); //5 通信 //获取客户端的数据 char recvbuf[1024]={0}; int len=read(cfd,recvbuf,sizeof(recvbuf)); if(len==-1) { perror("read"); exit(-1); } else if(len>0) { printf("recv client data: %s\n",recvbuf); } else if(len==0) { printf("client closed.....\n"); } //给客服端发送数据 char *data="hello i am serve"; write(cfd,"hello i am serve\n",strlen(data)); //关闭文件描述符 close(cfd); close(sockfd); return 0; }

服务端代码

//TCP通信的客户端 #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main() { //1 创建套接字 int cfd=socket(AF_INET,SOCK_STREAM,0); //2 与服务端的地址进行连接 struct sockaddr_in saddr; //先定义在初始化 saddr.sin_family=AF_INET; inet_pton(AF_INET,"192.168.68.128",&saddr.sin_addr.s_addr); saddr.sin_port=htons(9999); int ret=connect(cfd,(struct sockaddr *)&saddr,sizeof(saddr)); if(ret==-1) { perror("connect"); exit(-1); } //3 通信 //给服务端发送数据 char *data="hello i am client"; write(cfd,"hello i am client\n",strlen(data)); //读取 char recvbuf[1024]={0}; int len=read(cfd,recvbuf,sizeof(recvbuf)); if(len==-1) { perror("read"); exit(-1); } else if(len>0) { printf("recv server data: %s\n",recvbuf); } else if(len==0) { printf("server closed.....\n"); } //关闭文件描述符 close(cfd); return 0; }

多线程服务器

//TCP通信的服务端---多线程 #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <errno.h> #include <pthread.h> struct sockinfo { //封装结构体用于参数的传递 int fd; pthread_t tid; struct sockaddr_in saddr; }; struct sockinfo sockinfos[128]; void *working(void* arg) { //子线程与客服端通信的函数——需要客户端的信息 //获得客户端的信息 struct sockinfo *pinfo=(struct sockinfo *)arg; char clientip[16]; inet_ntop(AF_INET,&pinfo->saddr.sin_addr.s_addr,clientip,sizeof(clientip)); unsigned short clientport=ntohs(pinfo->saddr.sin_port); printf("ip : %s ,port : %d\n",clientip,clientport); //接收客服端的数据 char recvbuf[1024]={0}; while(1) { int len=read(pinfo->fd,&recvbuf,sizeof(recvbuf)); if(len==-1) { perror("read"); exit(-1); } else if(len>0) { printf("recvbuf is : %s\n",recvbuf); } else if(len==0){ printf("client closed...\n"); break; } write(pinfo->fd,recvbuf,sizeof(recvbuf)); } close(pinfo->fd); exit(-1); } int main() { //创建socket int lfd=socket(AF_INET,SOCK_STREAM,0); if(lfd==-1) { perror("SOCKET"); exit(-1); } //绑定 struct sockaddr_in saddr; saddr.sin_family=AF_INET; saddr.sin_addr.s_addr=INADDR_ANY; saddr.sin_port=htons(9999); bind(lfd,(struct sockaddr*)&saddr,sizeof(saddr)); //监听 listen(lfd,9); int max=sizeof(sockinfos)/sizeof(sockinfos[0]); for(int i=0;i<max;i++) { bzero(&sockinfos[i],sizeof(sockinfos[i])); sockinfos[i].tid=-1; sockinfos[i].fd=-1; } //循环等待连接,只要有客户端进入就创一个线程进程通信 while(1) { struct sockaddr_in clientaddr; int len=sizeof(clientaddr); //接受 int cfd=accept(lfd,(struct sockaddr*)&clientaddr,&len); if(cfd==-1) { if(errno==EINTR) { continue; } perror("accept"); exit(-1); } struct sockinfo *pinfo; for(int i=0;i<max;i++) { //在数组里找到一组可以用好的sockinfo元素 if(sockinfos[i].fd=-1) { pinfo=&sockinfos[i]; break; } if(i==max-1) { sleep(1); } } pinfo->fd=cfd; memcpy(&pinfo->saddr,&clientaddr,len); //连接一个创建一个子线程进行通信 pthread_create(&pinfo->tid,NULL,working,pinfo); pthread_detach(pinfo->tid); } close(lfd); return 0; }
http://www.jsqmd.com/news/1098835/

相关文章:

  • Python之rickshaw包语法、参数和实际应用案例
  • 基于PANDAS的QAbstractTableModel实现高级TableView详细解析(八、在TableView实现冻结窗口)
  • Confluence高危漏洞CVE-2022-26134应急响应与安全加固实战指南
  • 把 Enterprise Services Repository 配成一座稳定的集成设计中枢
  • 洛谷 P2024:[NOI2001] 食物链 ← 扩展域并查集
  • SpringBoot 底层原理完整教程(上篇・配置文件与配置优先级)
  • Anthropic揭秘Claude隔离内幕、加州政府半价用上AI、主权AI来了:今天6件大事
  • 35款自动脱壳工具合集:逆向工程中的“开罐器”与“手术刀”
  • 01 静态分析(Static Analysis)
  • *如何使用* *bc* 进行高级*数学*计算?
  • 只会写业务 UI 走不远!吃透这套 Framework 体系,跳槽大厂拉开薪资差距
  • 打卡信奥刷题(3414)用C++实现信奥题 P10139 [USACO24JAN] Nap Sort G
  • StarRocks StreamLoad 持续写入导致 be 内存增长
  • Kimi LeetCode 3410. 删除所有值为某个元素后的最大子数组和 Python3实现
  • 2026年桌面风扇类型选购要点:从四个核心部件看懂一台风
  • 羽毛球工具 App HarmonyOS 6.0 实战(02/10):ArkUI 响应式布局
  • Apache Commons Text RCE漏洞CVE-2022-42889:原理、复现与安全修复
  • 什么!翻译论文还要消耗token? 关于如何提升marker转英文文档速度,并使用skill批量翻译论文
  • 官方 API 与中转 API 选型实测指南
  • openEuler-portal-mcp智能推荐系统:如何实现100%工具推荐覆盖率
  • 广告创意提案怎么做?用多模型联动快速制作动态 Demo 提案实战与对比
  • VMware导入虚拟机失败?90%的运维人都踩过的7个隐藏陷阱及修复命令清单
  • 5大特色揭秘:ZR.Admin.NET企业级权限管理平台实战指南
  • 把 ES Repository 纳入 CMS 轨道,一套更稳的 SAP PI 内容传输治理方式
  • 羽毛球工具 App HarmonyOS 6.0 实战(03/10):本地优先数据方案
  • 从真实高可用链路看 SAP AEX local SLD 配置,别让 SLD 成为集群切换时的隐形单点
  • Kali Linux 渗透测试环境搭建:VMware 虚拟机安装配置全流程指南
  • Crypto方向 · RSA已知部分明文攻击(Coppersmith方法)
  • 浅谈C++重载、重写、重定义
  • YOLOv8知识蒸馏实战:从37%到42%mAP,无损提升轻量模型精度