尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

linux中TCP通信

linux中TCP通信
📅 发布时间:2026/6/30 23:08:53

客户端的代码

//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; }

相关新闻

  • 基于PANDAS的QAbstractTableModel实现高级TableView详细解析(八、在TableView实现冻结窗口)
  • Confluence高危漏洞CVE-2022-26134应急响应与安全加固实战指南
  • 把 Enterprise Services Repository 配成一座稳定的集成设计中枢

最新新闻

  • SSH多身份管理介绍(多个SSH账号、Host别名、~/.ssh/config文件、SSH密钥、SSH身份)
  • 0630晨间日记
  • 摄影工作流革命:semi-utils批量水印工具的完整解决方案
  • 用Arduino Nano和DS1906b舵机DIY仿生蝴蝶飞行器:从材料选择到代码调参的完整避坑指南
  • 程序员如何通过漏洞挖掘实现技术变现:从SRC入门到实战进阶
  • Windows Defender终极管理指南:开源工具实现永久禁用

日新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号