线程实现tcp服务器

落日映苍穹つ 2022-07-14 12:09 251阅读 0赞

线程实现tcp服务器

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <netdb.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <sys/socket.h>
  9. #define portnumber 3333
  10. void * read_msg(void *arg)
  11. {
  12. int fd = *((int *)arg);
  13. int nread = 0;
  14. char buffer[1024];
  15. while((nread = read(fd,buffer,sizeof(buffer))) > 0)
  16. {
  17. buffer[nread] = '\0';
  18. printf("get client message: %s\n",buffer);
  19. memset(buffer,0,sizeof(buffer));
  20. }
  21. }
  22. void * write_msg(void * arg)
  23. {
  24. int fd = *((int *)arg);
  25. while(1)
  26. {
  27. write(fd,"hello",5);
  28. sleep(2);
  29. }
  30. }
  31. int main(int argc, char *argv[])
  32. {
  33. int sockfd,new_fd;
  34. struct sockaddr_in server_addr;
  35. struct sockaddr_in client_addr;
  36. int sin_size;
  37. int nbytes;
  38. char buffer[1024];
  39. pthread_t id;
  40. /* 服务器端开始建立sockfd描述符 */
  41. if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) // AF_INET:IPV4;SOCK_STREAM:TCP
  42. {
  43. fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
  44. exit(1);
  45. }
  46. /* 服务器端填充 sockaddr结构 */
  47. bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,置0
  48. server_addr.sin_family=AF_INET; // Internet
  49. server_addr.sin_addr.s_addr=htonl(INADDR_ANY); // (将本机器上的long数据转化为网络上的long数据)和任何主机通信 //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP
  50. //server_addr.sin_addr.s_addr=inet_addr("192.168.1.1"); //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
  51. server_addr.sin_port=htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号
  52. /* 捆绑sockfd描述符到IP地址 */
  53. if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
  54. {
  55. fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
  56. exit(1);
  57. }
  58. /* 设置允许连接的最大客户端数 */
  59. if(listen(sockfd,5)==-1)
  60. {
  61. fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
  62. exit(1);
  63. }
  64. while(1)
  65. {
  66. /* 服务器阻塞,直到客户程序建立连接 */
  67. sin_size=sizeof(struct sockaddr_in);
  68. printf("accepting!\n");
  69. if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
  70. {
  71. fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
  72. exit(1);
  73. }
  74. fprintf(stderr,"Server get connection from %s\n",inet_ntoa(client_addr.sin_addr)); // 将网络地址转换成.字符串
  75. pthread_create(&id,NULL,(void *)read_msg,(void *)&new_fd);
  76. pthread_create(&id,NULL,(void *)write_msg,(void *)&new_fd);
  77. }
  78. /* 结束通讯 */
  79. close(sockfd);
  80. exit(0);
  81. }

发表评论

表情:
评论列表 (有 0 条评论,251人围观)

还没有评论,来说两句吧...

相关阅读

    相关 QT TCP服务器实现

    1.TCP通信概述 tcp是一种用于数据传输的低级网络协议,它是可靠的、面向流、面向连接的传输协议,特别适合于连续数据传输。 服务器端使用QTcpServer用于端口监