• 0922hw


    1. #include
    2. #include
    3. #include
    4. int main(int argc, char const *argv[])
    5. {
    6. // 创建流式套接字
    7. int cfd = socket(AF_INET, SOCK_STREAM, 0);
    8. if (0 == cfd)
    9. {
    10. perror("socket");
    11. printf("__%d__\n", __LINE__);
    12. return -1;
    13. }
    14. // 允许端口快速复用
    15. int reuse = 1;
    16. if (setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    17. {
    18. perror("setsockopt");
    19. printf("__%d__", __LINE__);
    20. return -1;
    21. }
    22. printf("允许端口快速复用成功\n");
    23. // 绑定服务器的地址信息//非必要
    24. struct sockaddr_in sin;
    25. sin.sin_family = AF_INET; // 必须填AF_INET
    26. sin.sin_port = htons(7777); // 服务器绑定的端口
    27. sin.sin_addr.s_addr = inet_addr("192.168.125.17"); // 服务器绑定的IP
    28. // 连接服务器需要填服务器的地址信息
    29. if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) < 0)
    30. {
    31. perror("connect");
    32. printf("__%d__", __LINE__);
    33. return -1;
    34. }
    35. char buf[128] = "";
    36. int res = 0;
    37. ssize_t s_res = -1;
    38. // 创建读集合
    39. fd_set readfds, writepfds;
    40. // 清空集合
    41. FD_ZERO(&readfds);
    42. // 添加文件描述符到集合中
    43. FD_SET(0, &readfds);
    44. FD_SET(cfd, &readfds);
    45. FD_SET(cfd, &writepfds);
    46. int maxfd = cfd;
    47. while (1)
    48. {
    49. // 调用IO多路复用函数,阻塞检测集合
    50. s_res = select(maxfd + 2, &readfds, &writepfds, NULL, NULL);
    51. if (s_res < 0)
    52. {
    53. perror("select");
    54. return -1;
    55. }
    56. else if (0 == s_res)
    57. {
    58. puts("time out....");
    59. break;
    60. }
    61. if (FD_ISSET(cfd, &writepfds) == 0)
    62. continue;
    63. else
    64. {
    65. // 发送数据
    66. char buf[128] = "";
    67. fgets(buf, sizeof(buf), stdin);
    68. buf[strlen(buf) - 1] = 0;
    69. send(cfd, buf, sizeof(buf), 0);
    70. if (strcmp(buf, "quit") == 0)
    71. break;
    72. printf("发送成功\n");
    73. // 接收数据
    74. bzero(buf, sizeof(buf));
    75. res = recv(cfd, buf, sizeof(buf), 0);
    76. printf("[%s : %d] newsfd=%d , %s , __%d__\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), cfd, buf, __LINE__);
    77. }
    78. }
    79. // 关闭套接字
    80. close(cfd);
    81. retern 0;
    82. ]

  • 相关阅读:
    北京程序员的真实一天!!!!!
    Vue-axios的get、post请求
    【数据结构】—超级详细的归并排序(含C语言实现)
    C#非托管泄漏中HEAP_ENTRY的Size对不上是怎么回事?
    Estimation with Bootstrap
    数据库存储引擎和数据类型详细介绍
    Flutter应用发布流程详解:从开发到上架一站式指南
    AVPro Movie Capture☀️三、Unity录屏:录制摄像机指定区域
    SpringBoot热部署
    Java:更好的Java: JDK增强提案解释
  • 原文地址:https://blog.csdn.net/qiujunhang/article/details/133210615