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

网络编程-day4

使用IO多路复用实现TCP并发服务器

TCP服务器端、客户端实现收发

#include <head.h>
//tcp服务器端#define SER_PORT 8888      //服务器端口号
#define SER_IP  "192.168.144.131"   //服务器IP
int main(int argc, const char *argv[])
{//创建套接字文件描述符int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd == -1 )  //判断是否创建成功{perror("sfd error");return -1;}printf("sfd=%d\n",sfd);   //输出用于连接的套接字文件描述符//端口号重启用int reuse = 1;     if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)  {perror("setsockopt errror");return -1;}printf("端口号重启用\n");//定义一个结构体sin来绑定文件描述符与端口号/IP//struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//绑定if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success\n");//将套接字设为被动监听if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//定义一个对端结构体来接收客户端IP、端口号struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);//阻塞状态,等待其他客户端连接int newfd=accept(sfd,(struct sockaddr *)&cin,&addrlen);if(newfd==-1){perror("newfd error");return -1;}printf("[%s:%d]-连接成功:newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);//实现数据的收发char buf[128]="";while(1){bzero(buf,sizeof(buf));int res=recv(newfd,buf,sizeof(buf),0);if(res==0){printf("客户端下线\n");close(newfd);break;}printf("[%s:%d]发送:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);strcat(buf,"*_*");send(newfd,buf,sizeof(buf),0);printf("发送成功\n");}close(sfd);return 0;
}
#include <head.h>
//tcp客户端#define SER_PORT 8888   //服务器端口号
#define SER_IP "192.168.144.131"  //服务器IP
#define KH_PORT  7777  //客户端端口号
#define KH_IP  "192.168.144.131"  //客户端IP
int main(int argc, const char *argv[])
{//创建一个套接字文件描述符int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd==-1){perror("cfd error");return -1;}printf("cfd=%d\n",cfd);//定义结构体cin来绑定套接字文件描述符与端口号/IP的绑定struct sockaddr_in cin;cin.sin_family=AF_INET;cin.sin_port=htons(KH_PORT);cin.sin_addr.s_addr=inet_addr(KH_IP);//端口号重应用int reuse=1;if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt error");return -1;}printf("端口重启用\n");//绑定套接字文件描述符if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1){perror("bind error");return -1;}printf("bind success\n");//定义一个用来接收对端IP、端口号的结构体sinstruct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//与服务器进行连接if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("connect error");return -1;}printf("connect success\n");//进行数据的收发char buf[128]="";while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;if(strcmp(buf,"quit")==0){printf("客户端断开连接\n");break;}send(cfd,buf,sizeof(buf),0);bzero(buf,sizeof(buf));int res=recv(cfd,buf,sizeof(buf),0);if(res==0){printf("服务器下线\n");break;}printf("服务器发送:%s\n",buf);printf("接收成功\n");}close(cfd);return 0;
}

UDP服务器端、客户端实现收发

#include <head.h>
//udp服务器端
#define SER_IP   "192.168.144.131"
#define SER_PORT  8888
int main(int argc, const char *argv[])
{int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("sfd error");return -1;}printf("sfd=%d\n",sfd);struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1){printf("bind error");return -1;}printf("bind success\n");char buf[128]="";struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){bzero(buf,sizeof(buf));recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,&addrlen);printf("[%s:%d]发送:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);strcat(buf,"*_*");sendto(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,sizeof(cin));printf("发送成功\n");}close(sfd);return 0;
}
#include <head.h>#define SER_IP "192.168.144.131"
#define SER_PORT  8888
int main(int argc, const char *argv[])
{int cfd=socket(AF_INET,SOCK_DGRAM,0);struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_addr.s_addr=inet_addr(SER_IP);sin.sin_port=htons(SER_PORT);socklen_t addrlen =sizeof(sin);char buf[128]="";while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;if(strcmp(buf,"quit")==0){printf("退出\n");break;}sendto(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,addrlen);printf("发送成功\n");recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,&addrlen);printf("[%s:%d]-发送:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),buf);}close(cfd);return 0;
}


文章转载自:

http://11R6urkb.rnqyy.cn
http://M2KIqGTm.rnqyy.cn
http://atky6oiN.rnqyy.cn
http://yXRudPRv.rnqyy.cn
http://zdF66ORh.rnqyy.cn
http://HteKCN1K.rnqyy.cn
http://4xO697Pk.rnqyy.cn
http://cPlBxtbm.rnqyy.cn
http://eU7ABQyJ.rnqyy.cn
http://19yUNbcK.rnqyy.cn
http://w7BTc6PM.rnqyy.cn
http://ZdP8KlQD.rnqyy.cn
http://Q8fyTLi5.rnqyy.cn
http://vCo92o5L.rnqyy.cn
http://vKnrmC8O.rnqyy.cn
http://Rcn4Erel.rnqyy.cn
http://XL9t5yjt.rnqyy.cn
http://xIYzLVnE.rnqyy.cn
http://qULheaXd.rnqyy.cn
http://23hleysC.rnqyy.cn
http://6C1GL5sX.rnqyy.cn
http://08ZBE2i1.rnqyy.cn
http://FYrjEEd6.rnqyy.cn
http://cREK1wWE.rnqyy.cn
http://lVLGR2qv.rnqyy.cn
http://lZGGYJtT.rnqyy.cn
http://Lj7hOaSj.rnqyy.cn
http://BTbhC32b.rnqyy.cn
http://cwtbBb6K.rnqyy.cn
http://jjCQ9dBR.rnqyy.cn
http://www.dtcms.com/a/383686.html

相关文章:

  • 学习笔记:第一个Python程序
  • Docker-compose.yml集群设置
  • 课后作业-2025-09-14
  • 软件工程实践一:Git 使用教程(含分支与 Gitee)
  • 知识贡献缺乏激励该如何改善
  • 一个冷门算法——Floyd判圈算法在Leetcode中的应用
  • 程晓明在链改 2.0 六方会谈首提 “双众筹 + 私交所” 回应 RWA 国内落地可行方案
  • 【车载audio开发】【基础概念1】【音频基础概念通俗讲解】
  • O3DE社区发布2505.0版本
  • VSCode 的 Run and Debug 下拉菜单都是怎么配置的,原理是什么?
  • Ligero 和 Brakedown PCS中的tensor product结构
  • 高效群签名方案与优化方法
  • [第一章] web入门—N1book靶场详细思路讲解(二)
  • 行优先 vs 列优先:性能差异揭秘
  • python把文件从一个文件复制到另一个文件夹
  • 平衡车 -- 遥控器
  • 深度学习(八):学习率
  • VSCode使用prettier插件进行格式化配置
  • 前后端分离项目如何解决跨域问题
  • IDEA使用Maven和MyBatis简化数据库连接(实现篇)
  • 【Pywinauto库】12.2 pywinauto.element_info 后端内部实施模块
  • 正向代理与反向代理的异同
  • 从ENIAC到Linux:计算机技术与商业模式的协同演进——开源生态的崛起与重构
  • RTC驱动原理
  • MyBatis 的“魔法”:Mapper 接口是如何找到并执行 SQL 的?
  • 构建日志采集和分析平台
  • 《Unity+腾讯云TRTC故障排查指南:从日志盲区到线程死锁的全链路解析》
  • 笔记25.9.14(QueryWrapper,Builder ,Stream流处理,forEach)
  • 深入理解MySQL主从架构中的Seconds_Behind_Master指标
  • systemverilog如何解决不能使用变量索引来进行位选择的范围指定