千家信息网

unix socket网络编程TCP简单例子

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,server.c#include #include #include #include #include #include #include #include int main(int
千家信息网最后更新 2025年12月02日unix socket网络编程TCP简单例子
  1. server.c
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <arpa/inet.h>
  8. #include <stdio.h>
  9. #include <unistd.h>
  10. int main(int argc, char** argv)
  11. {
  12. int ret;
  13. //创建socket文件
  14. int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  15. if(sockfd == -1)
  16. {
  17. perror("socket\n");
  18. exit(1);
  19. }
  20. printf("socket_fd = %d\n",sockfd);
  21. //重复使用本地址与socket文件进行绑定,如果不设置系统,会保留此连接直到最后一引用才释放,即进程结束后系统需要几分钟后才能重新进行绑定
  22. int i = 1;
  23. ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
  24. if(ret)
  25. {
  26. perror("setsockopt\n");
  27. exit(1);
  28. }
  29. printf("setsockopt complete!\n");
  30. //创建服务器socket地址sock_addr
  31. struct sockaddr_in server_addr;
  32. server_addr.sin_family = AF_INET;
  33. server_addr.sin_port = htons(4444);
  34. //地址指定INADDR_ANY表示可以接收安装在系统里面所有网卡的数据包
  35. server_addr.sin_addr.s_addr = INADDR_ANY;
  36. memset(server_addr.sin_zero, 8, 8);
  37. //将socket与地址进行绑定,这样可以使所有发向端口4444及协议为IPV4数据包指向socket文件
  38. ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
  39. if(ret)
  40. {
  41. perror("bind\n");
  42. exit(1);
  43. }
  44. printf("bind complete!\n");
  45. //监听连接到该socket上请求,不会发生阻塞行为,以下设置队列大小为1,即队列满的时候其它连接会被拒绝连接
  46. ret = listen(sockfd, 10);
  47. if(ret)
  48. {
  49. perror("listen\n");
  50. exit(1);
  51. }
  52. printf("listen complete!\n");
  53. //接收连接请求并建立连接, 如果没有连接请求 accept会一址阻塞,直到有请求来
  54. struct sockaddr_in client_addr;
  55. int client_fd;
  56. socklen_t len = sizeof(struct sockaddr);
  57. client_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len);
  58. if(client_fd == -1)
  59. {
  60. perror("bind\n");
  61. exit(1);
  62. }
  63. printf("accept complete!\n");
  64. //请取client发来的信息
  65. char buf[100];
  66. ssize_t readnum;
  67. memset(buf,100,0);
  68. //这里应该是客户端的socket文件描述符
  69. readnum = recv(client_fd, (void*)buf, 100, MSG_WAITALL);
  70. //清空标准输出
  71. fflush(stdout);
  72. printf("received:%s\nnumber byte:%d\n",buf,strlen(buf));
  73. //发送信息到用户端
  74. ssize_t sendnum;
  75. char content[100]="\"server:received the data!\"";
  76. sendsendnum = send(client_fd, content, 100, 0);
  77. printf("reply:%s\nnumber byte:%d\n",content,sendnum);
  78. // 关闭socket文件
  79. close(sockfd);
  80. close(client_fd);
  81. return 0;
  82. }
  83. client.c
  84. #include <sys/types.h>
  85. #include <sys/socket.h>
  86. #include <stdio.h>
  87. #include <stdlib.h>
  88. #include <string.h>
  89. #include <arpa/inet.h>
  90. #include <stdio.h>
  91. #include <unistd.h>
  92. #include <arpa/inet.h>
  93. int main(int argc, char** argv)
  94. {
  95. int ret;
  96. //创建socket文件
  97. int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  98. if(sockfd == -1)
  99. {
  100. perror("socket\n");
  101. exit(1);
  102. }
  103. printf("socket_fd = %d\n",sockfd);
  104. //创建服务器socket地址sock_addr
  105. struct sockaddr_in server_addr;
  106. server_addr.sin_family = AF_INET;
  107. server_addr.sin_port = htons(4444);
  108. //将字符串地址转换成网络地址,有两种方法
  109. inet_pton(AF_INET, "127.0.0.1", (void*)&server_addr.sin_addr.s_addr);//IPV4 IPV6可用
  110. //server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//只能转IPV4
  111. memset(server_addr.sin_zero, 8, 0);
  112. //连接服务端
  113. ret = connect(sockfd, (struct sockaddr*)&server_addr,sizeof(struct sockaddr));
  114. if(ret == -1)
  115. {
  116. perror("connect\n");
  117. exit(1);
  118. }
  119. printf("connect complete!\n");
  120. //发送信息
  121. char content[100] = "\"hello,i am client!\"";
  122. ssize_t sendsendnum = send(sockfd, content, strlen(content)+1, 0);
  123. printf("send complete\nnumber byte:%d\ncontent:%s\n",sendnum,content);
  124. //收信息
  125. char buf[100];
  126. ssize_t readnum;
  127. memset(buf,100,0);
  128. readnum = recv(sockfd, (void*)buf, 100, MSG_WAITALL);
  129. //清空标准输出
  130. fflush(stdout);
  131. printf("received:%s\nnumber byte:%d\n",buf,strlen(buf));
  132. //关闭socket
  133. close(sockfd);
  134. return 0;
  135. }
0