免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1869 | 回复: 3
打印 上一主题 下一主题

线程服务器端程序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-14 15:46 |只看该作者 |倒序浏览
现在能连多个客户端,但是一个客户端ctrl+c关闭,起的服务也会自己关,不知道怎么回事了,求指点,线程刚学!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <termios.h>
  9. #include <errno.h>
  10. #include <sys/unistd.h>
  11. #include <sys/socket.h>
  12. #include <pthread.h>
  13. #include <unistd.h>
  14. #include <arpa/inet.h>
  15. #include <signal.h>
  16. #include <netinet/in.h>
  17. #include <sys/wait.h>
  18. #include <stdarg.h>
  19. #include <netdb.h>
  20. #include <netinet/ip_icmp.h>
  21. #include <math.h>
  22. #include <netinet/in.h>
  23. #include <sys/time.h>
  24. #include <pthread.h>

  25. #define HELLO_WORLD_SERVER_PORT 6666
  26. #define LENGTH_OF_LISTEN_QUEUE 20
  27. #define BUFFER_SIZE 1024
  28. #define THREAD_MAX 5

  29. void * talk_to_client(void *data)
  30. {
  31.         int new_server_socket = (int)data;
  32.         char buffer[BUFFER_SIZE];
  33.         while(1){
  34.                 bzero(buffer, BUFFER_SIZE);
  35.                 strcpy(buffer,"Hello,World! 从服务器来!");
  36.                 strcat(buffer,"\n"); //C语言字符串连接
  37.         //发送buffer中的字符串到new_server_socket,实际是给客户端
  38.                 send(new_server_socket,buffer,BUFFER_SIZE,0);
  39.                 bzero(buffer,BUFFER_SIZE);
  40.                 sleep(1);
  41.                 printf("-----client----------- %d\n",test_i);
  42.         //接收客户端发送来的信息到buffer中
  43. #if 1
  44.                 int length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
  45.                 if (length <0) {
  46.                         printf("Server Recieve Data Failed!\n");
  47.                         exit(1);
  48.                 }
  49.                 printf("\nSocket Num: %d \t %s",new_server_socket, buffer);
  50. #endif
  51.         }
  52.         printf("1122222111111111\n");
  53.         close(new_server_socket);
  54.         pthread_exit(NULL);
  55. }

  56. int main(int argc, char **argv)
  57. {
  58.         //设置一个socket地址结构server_addr,代表服务器internet地址, 端口
  59.         struct sockaddr_in server_addr;
  60.         int new_server_socket=-1;
  61.         time_t t1,t2;
  62.         fd_set  fdR;
  63.         struct timeval  timev;
  64.         int maxfd;
  65.         struct sockaddr_in client_addr;
  66.         pthread_t child_thread;
  67.         pthread_attr_t child_thread_attr;

  68.         bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
  69.         server_addr.sin_family = AF_INET;
  70.         server_addr.sin_addr.s_addr = htons(INADDR_ANY);
  71.         server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
  72.         //创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
  73.         int server_socket = socket(AF_INET,SOCK_STREAM,0);
  74.         if( server_socket <0) {
  75.                 printf("Create Socket Failed!");
  76.                 exit(1);
  77.         }

  78.         //把socket和socket地址结构联系起来
  79.         if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {
  80.                 printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
  81.                 exit(1);
  82.         }

  83.         //server_socket用于监听
  84.         if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ) {
  85.                 printf("Server Listen Failed!");
  86.                 exit(1);
  87.         }


  88.         int i,ret;
  89.         while(1) //服务器端要一直运行
  90.         {
  91.                 FD_ZERO(&fdR);
  92.                 FD_SET(server_socket, &fdR);
  93.                 maxfd=server_socket;

  94.                 timev.tv_sec = 0;
  95.                 timev.tv_usec = 5000;
  96.                 ret = select(maxfd+1, &fdR, NULL, NULL,  &timev);
  97.                 if (ret < 0) {
  98.                         printf("select delay\n");
  99.                         continue;
  100.                 }
  101.                 if(FD_ISSET(server_socket,&fdR)) {

  102.         //定义客户端的socket地址结构client_addr
  103.                         socklen_t length = sizeof(client_addr);
  104. //接受一个到server_socket代表的socket的一个连接
  105. //如果没有连接请求,就等待到有连接请求--这是accept函数的特性
  106. //accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
  107. //new_server_socket代表了服务器和客户端之间的一个通信通道
  108. //accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
  109.                         new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
  110.                         if ( new_server_socket <0) {
  111.                                 printf("Server Accept Failed!\n");
  112.                                 break;
  113.                         } else  {
  114. //              pthread_attr_init(&child_thread_attr);
  115. //              pthread_attr_setdetachstate(&child_thread_attr,PTHREAD_CREATE_DETACHED);
  116.                         if( pthread_create(&child_thread,NULL,talk_to_client, (void *)new_server_socket) <0 )
  117.                                 printf("pthread_create Failed : %s\n",strerror(errno));
  118.                         }
  119.                 }
  120.         }
  121. //关闭监听用的socket
  122.         printf("11111111111111111\n");
  123.         close(server_socket);
  124.         return 0;
  125. }
复制代码

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2011-01-14 16:07 |只看该作者
服务端忽略 SIGPIPE 信号,或者send的时候用 MSG_NOSIGNAL 参数

论坛徽章:
0
3 [报告]
发表于 2011-01-14 16:22 |只看该作者
服务端忽略 SIGPIPE 信号,或者send的时候用 MSG_NOSIGNAL 参数

??现在是多客户端只要其中一个关了,server这边就关了,我认为应该和线程调用有关?
请指教

论坛徽章:
0
4 [报告]
发表于 2011-01-14 16:31 |只看该作者
ok了
调用了MSG_NOSIGNAL 谢谢hellioncu
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP