免费注册 查看新帖 |

Chinaunix

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

问个socket加pthread的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-16 11:58 |只看该作者 |倒序浏览
我的表达能力比较差,请大家多包涵.
我的问题是:一个udp程序,主线程已经bind了,新开了一个线程,这个线程把端口改为0,再bind一次,这种做法是否正确,为什么要这么做?具体看下面代码.



  1. void* fn(void *arg){
  2.         int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  3.        
  4.         server.sin_family = AF_INET;
  5.         server.sin_addr.s_addr = INADDR_ANY;
  6.         server.sin_port = 0;//这里把端口设成0

  7.         bind(sock, (struct sockaddr *)&server, sizeof(server)) ;//主线程里已经bind过了,在这里再次bind,不知道为什么要这样做?
  8.                  ..................
  9. }
  10.        

  11. main(){

  12. struct sockaddr_in addr;

  13. int sock=socket(AF_INET,SOCK_DGRAM, IPPROTO_UDP);

  14. addr.sin_family=AF_INET;
  15. addr.sin_addr.s_addr=INADDR_ANY;
  16. addr.sin_port=htons(9000);

  17. bind(sock,(struct sockaddr*)&addr,sizeof(addr));//在这里主线程已经bind了

  18. ................

  19. pthread_create(&pid,NULL,fn,&other_args);

  20. ...............

  21. }

复制代码

[ 本帖最后由 xxldc 于 2008-4-16 12:47 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-04-16 12:02 |只看该作者
不知所云

论坛徽章:
0
3 [报告]
发表于 2008-04-16 12:52 |只看该作者
原帖由 flw 于 2008-4-16 12:02 发表
不知所云


论坛徽章:
0
4 [报告]
发表于 2008-04-16 13:50 |只看该作者
原帖由 xxldc 于 2008-4-16 11:58 发表
我的表达能力比较差,请大家多包涵.
我的问题是:一个udp程序,主线程已经bind了,新开了一个线程,这个线程把端口改为0,再bind一次,这种做法是否正确,为什么要这么做?具体看下面代码.



void* fn(void *arg){ ...


调用两次
  int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
生成的sock是不一样的! 实际上你生成了两个不一样的socket,当然可以bind了(port 也没冲突)!

论坛徽章:
0
5 [报告]
发表于 2008-04-16 14:48 |只看该作者
原帖由 system888net 于 2008-4-16 13:50 发表


调用两次
  int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
生成的sock是不一样的! 实际上你生成了两个不一样的socket,当然可以bind了(port 也没冲突)!



是的,bind两次,port不一样是可行的.可我就是不明白为什么不把主线程bind那个sock传给子线程,而非要在子线程中再bind一次得到个sock?再说bind端口0,这样做没有什么其他问题么?

论坛徽章:
0
6 [报告]
发表于 2008-04-16 15:17 |只看该作者
原帖由 xxldc 于 2008-4-16 14:48 发表



是的,bind两次,port不一样是可行的.可我就是不明白为什么不把主线程bind那个sock传给子线程,而非要在子线程中再bind一次得到个sock?再说bind端口0,这样做没有什么其他问题么?


bind端口0,是指由系统自动指定一个端口.

这段代码明显是main中生成了一个服务socket
子线程生成了一个client socket

两个socket的分工不一样!

论坛徽章:
0
7 [报告]
发表于 2008-04-16 15:34 |只看该作者
原帖由 system888net 于 2008-4-16 15:17 发表


bind端口0,是指由系统自动指定一个端口.

这段代码明显是main中生成了一个服务socket
子线程生成了一个client socket

两个socket的分工不一样!


udp的client需要bind么?直接sendto,recvfrom不就可以了?

论坛徽章:
0
8 [报告]
发表于 2008-04-16 15:38 |只看该作者
原帖由 xxldc 于 2008-4-16 15:34 发表


udp的client需要bind么?直接sendto,recvfrom不就可以了?


你说得对,可以不bind直接sendto.
两中写法都可以.

论坛徽章:
0
9 [报告]
发表于 2008-04-16 16:35 |只看该作者


[ 本帖最后由 xxldc 于 2008-4-16 16:42 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP