免费注册 查看新帖 |

Chinaunix

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

[网络] 将socket服务器端程序放入多线程后接收不到数据? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-24 15:45 |只看该作者 |倒序浏览
写了一个服务器端/客户端的socket程序。在本机上测试,运行正常。

有一个不明白的地方:我客户端连接的地址是127.0.0.1,但是服务器端读出来的时候,第一次不是127.0.0.1,。具体可见下面的输出信息:
服务器端代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <ctype.h>
  5. #include <sys/socket.h>
  6. #include <arpa/inet.h>
  7. #include <string.h>

  8. #define MAX_LINE 200

  9. void my_fun(char * p)
  10. {
  11.         if(p == NULL)
  12.                 return;

  13.         for (; *p != '\0'; p++)
  14.                 if(*p >= 'A' && *p <= 'Z')
  15.                         *p = *p -'A'+ 'a';
  16. }

  17. int main(void)
  18. {
  19.      struct sockaddr_in sin;
  20.      struct sockaddr_in cin;

  21.      int l_fd;
  22.      int c_fd;
  23.      socklen_t len;
  24.      char buf[MAX_LINE];
  25.      char savebuf[200];
  26.      char addr_p[INET_ADDRSTRLEN];
  27.      int port = 8000;
  28.      int n;

  29.      bzero(&sin, sizeof(sin));
  30.      sin.sin_family = AF_INET;
  31.      sin.sin_addr.s_addr = INADDR_ANY;
  32.      sin.sin_port = htons(port);
  33.    
  34.      l_fd = socket(AF_INET, SOCK_STREAM, 0);
  35.        
  36.      bind(l_fd, (struct sockaddr *)&sin, sizeof(sin));
  37.        
  38.      listen(l_fd, 10);
  39.        
  40.      printf("waiting ...\n");
  41.    
  42.         while(1)
  43.         {
  44.                 c_fd = accept(l_fd, (struct sockaddr *) &cin, &len);

  45.                 n = read(c_fd, buf, MAX_LINE);

  46.                 inet_ntop(AF_INET, &cin.sin_addr, addr_p, sizeof(addr_p));

  47.                 printf("client IP is %s, port is %d\n", addr_p, ntohs(sin.sin_port));
  48.                 printf("buf:%s \n",buf);
  49.                 my_fun(buf);
  50.                 write(c_fd, buf, n);
  51.                 close(c_fd);
  52.         }

  53.         if(close(l_fd) == -1){
  54.                 perror("fail to close");
  55.                 exit(1);
  56.         }

  57.         return 0;
  58. }
复制代码
客户端代码:

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <string.h>

  7. #define MAX_LINE 200

  8. int main(int argc, char *argv[])
  9. {
  10.      struct sockaddr_in sin;
  11.      char buf[MAX_LINE];
  12.      int sfd;
  13.      int port = 8000;
  14.      char *str = "TEST STRING";

  15.      if (argc > 1)
  16.           str = argv[1];

  17.      bzero(&sin, sizeof(sin));
  18.      sin.sin_family = AF_INET;       
  19.      inet_pton(AF_INET, "127.0.0.1", &sin.sin_addr);
  20.      sin.sin_port = htons(port);

  21.      sfd = socket(AF_INET, SOCK_STREAM, 0);
  22.      connect(sfd, (struct sockaddr_in *)&sin, sizeof(sin));
  23.      write(sfd, str, strlen(str) + 1);
  24.      read(sfd, buf, MAX_LINE);

  25.      printf("recive from server: %s\n", buf);
  26.      close(sfd);

  27.      return 0;
  28. }
复制代码
程序输入输出信息:
  1. input:
  2. [root@localhost 2]# ./client "wwwwwwww"
  3. recive from server: wwwwwwww
  4. [root@localhost 2]# ./client "wwwwwwww"
  5. recive from server: wwwwwwww
  6. [root@localhost 2]# ./client "wwwwwwww"
  7. recive from server: wwwwwwww
  8. [root@localhost 2]# ./client "wwwwwwww"
  9. recive from server: wwwwwwww

  10. output:
  11. [root@localhost 2]# ./server
  12. waiting ...
  13. client IP is 56.249.234.191, port is 8000     //为什么这里得到的IP不是127.0.0.1
  14. buf:wwwwwwww
  15. client IP is 127.0.0.1, port is 8000
  16. buf:wwwwwwww
  17. client IP is 127.0.0.1, port is 8000
  18. buf:wwwwwwww
  19. client IP is 127.0.0.1, port is 8000
  20. buf:wwwwwwww
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-10-24 15:50 |只看该作者
然后我将服务器端的代码放入一个多线程中,
main函数的代码为:

  1. int main(int argc, char *argv[])
  2. {
  3.         pthread_t t;                        
  4.           pthread_create(&t,NULL,mysocket,NULL);   //socket
  5.         while(1)
  6.         {
  7.         }

  8.         return 0;
  9. }
复制代码
多线程函数mysocket与上面服务器端代码一样。

运行后只能得到:

  1. client IP is 56.249.234.191, port is 8000
复制代码
IP地址还会不一样。没有接收到客服端发送的数据。

请大家帮我分析一下,问题可能出在上面地方?

如果以后不是在本机运行,是不是只要将服务器的IP知道告知客户端,让客户端去连接这个IP就可以?

端口是服务器端指定的,还是客服端自己定就可以了?

初学者,往指导。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-24 16:09 |只看该作者
len你没有赋值, 这是一个in/out参数, 你需要len = sizeof(struct sockaddr_in);

论坛徽章:
0
4 [报告]
发表于 2012-10-24 16:12 |只看该作者
回复 3# linux_c_py_php


眼神真犀利 是的。

这是我在拷贝代码的时候犯的错。实际的程序是有这一句的。谢谢。


   

论坛徽章:
0
5 [报告]
发表于 2012-10-25 08:51 |只看该作者
没人知道啊。

论坛徽章:
0
6 [报告]
发表于 2012-10-25 13:45 |只看该作者
问题解决了

自己2了  

把多线程里面的输出语句注释掉了。。。。

上面的代码调试通过
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP