• 网络编程day5作业


    1. 根据select TCP服务器流程图编写服务器(上交)

    1. #include
    2. #define ERR_MSG(msg) do{\
    3. fprintf(stderr,"__%d__",__LINE__);\
    4. perror(msg);\
    5. }while(0)
    6. #define PORT 6666
    7. #define IP "192.168.114.50"
    8. int main(int argc, const char *argv[])
    9. {
    10. //创建流式套接字
    11. int sfd=socket(AF_INET,SOCK_STREAM,0);
    12. if(sfd<0)
    13. {
    14. ERR_MSG("socket");
    15. return -1;
    16. }
    17. printf("socket create success! sfd=%d\n",sfd);
    18. //允许端口快速被复用
    19. int reuse=1;
    20. if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))<0)
    21. {
    22. ERR_MSG("setsockopt");
    23. return -1;
    24. }
    25. printf("允许端口快速被复用成功\n");
    26. struct sockaddr_in sin;
    27. sin.sin_family=AF_INET;
    28. sin.sin_port=htons(PORT);
    29. sin.sin_addr.s_addr=inet_addr(IP);
    30. if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))<0)
    31. {
    32. ERR_MSG("bind");
    33. return -1;
    34. }
    35. printf("bind success\n");
    36. if(listen(sfd,128)<0)
    37. {
    38. ERR_MSG("listen");
    39. return -1;
    40. }
    41. //创建一个读的集合
    42. fd_set readfds,tempfds;
    43. //清空集合
    44. FD_ZERO(&readfds);
    45. //将需要监测的文件描述符放入到集合中
    46. FD_SET(0,&readfds);
    47. FD_SET(sfd,&readfds);
    48. int maxfd=sfd;
    49. char buf[128]="";
    50. ssize_t res=-1;
    51. int newfd=-1;
    52. int s_res=-1;
    53. struct sockaddr_in savaCin[1024];
    54. struct sockaddr_in cin;
    55. socklen_t addrlen=sizeof(cin);
    56. while(1)
    57. {
    58. tempfds=readfds;
    59. s_res=select(maxfd+1,&tempfds,NULL,NULL,NULL);
    60. if(s_res<0)
    61. {
    62. ERR_MSG("select");
    63. return -1;
    64. }
    65. if(0==s_res)
    66. {
    67. printf("time out..\n");
    68. break;
    69. }
    70. printf("__%d__\n",__LINE__);
    71. for(int i=0;i<=maxfd;i++)
    72. {
    73. if(FD_ISSET(i,&tempfds)==0)
    74. {
    75. continue;
    76. }
    77. if(0==i)
    78. {
    79. printf("触发键盘输入事件\n");
    80. bzero(buf,sizeof(buf));
    81. fgets(buf,sizeof(buf),stdin);
    82. buf[strlen(buf)-1]=0;
    83. printf("输出:%s\n",buf);
    84. }
    85. else if(sfd==i)
    86. {
    87. printf("触发客户端连接事件\n");
    88. newfd=accept(i,(struct sockaddr*)&cin,&addrlen);
    89. if(newfd<0)
    90. {
    91. ERR_MSG("accept");
    92. return -1;
    93. }
    94. printf("[%s:%d]客户端连接成功newfd=%d\n",\
    95. inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
    96. FD_SET(newfd,&readfds);
    97. savaCin[newfd]=cin;
    98. maxfd=maxfd>newfd?maxfd:newfd;
    99. }
    100. else
    101. {
    102. printf("触发客户端交互事件\n");
    103. //清空字符串
    104. bzero(buf,sizeof(buf));
    105. //接收
    106. res=recv(i,buf,sizeof(buf),0);
    107. if(res<0)
    108. {
    109. ERR_MSG("recv");
    110. return -1;
    111. }
    112. if(0==res)
    113. {
    114. printf("[%s:%d]客户端下线newfd=%d\n",\
    115. inet_ntoa(savaCin[i].sin_addr),ntohs(savaCin[i].sin_port),i);
    116. close(i);
    117. FD_CLR(i,&readfds);
    118. for(;maxfd>=0;maxfd--)
    119. {
    120. if(FD_ISSET(maxfd,&readfds))
    121. {
    122. break;
    123. }
    124. }
    125. continue;
    126. }
    127. printf("[%s:%d]newfd=%d:%s\n",\
    128. inet_ntoa(savaCin[i].sin_addr),ntohs(savaCin[i].sin_port),i,buf);
    129. //发送
    130. strcat(buf,"zyz");
    131. if(send(i,buf,sizeof(buf),0)<0)
    132. {
    133. ERR_MSG("send");
    134. return -1;
    135. }
    136. printf("send success\n");
    137. }
    138. }
    139. }
    140. if(close(sfd)<0)
    141. {
    142. ERR_MSG("close");
    143. return -1;
    144. }
    145. return 0;
    146. }

    思维导图:https://mubu.com/app/edit/home/4LfFX79g2CD#m

  • 相关阅读:
    Spring七天速成:入门必看(一)
    《WEB前端框架开发技术》HTML5响应式旅游景区网站设计与实现——榆林子州HTML+CSS+JavaScript...
    Codeforces Round 907 (Div. 2——ABC)
    阿里p8实战总结SpringCloud微服务分布式系统文档
    【夜读】一个人越活越好的5个习惯
    基于安卓的校园信息助手系统设计(Eclipse开发)
    go, 随机实例化xml (2)
    SSm+Java+VUE基于微信小程序的学习资料销售平台#毕业设计
    图神经网络关系抽取论文阅读笔记(四)
    PCS7中如何实现DB块变量的自动上传
  • 原文地址:https://blog.csdn.net/m0_59031281/article/details/132610580