免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1912 | 回复: 3

[C++] 往线程里传sock_fd时出现的问题 [复制链接]

论坛徽章:
0
发表于 2010-03-18 17:59 |显示全部楼层
void recv_thread(int *sock_fd)
{
    int sockfd;

    sockfd = *sock_fd;
    len = sizeof(client_addr);
    memset(buf, 0, 1024);
    printf("*sock_fd = %d\n", *sock_fd);
    printf("sockfd = %d\n", sockfd);

    while(1){

        recvbytes = recvfrom(*sock_fd, buf, 1024, 0,
                (struct sockaddr *)&client_addr, &len);
        if (recvbytes == -1){
            perror("receive");
            exit(1);
        }
}

往线程里传一个socket的文件描述符的时候,其中*sock_fd, sockfd输出的值是一样的,但是以上代码,在线程运行后会出现错误,
但是如果把*sock_fd赋值给sockfd,在将recvfrom中的*sock_fd换成sockfd的时候,程序运行正常了,不知道为什么,求大虾们解释下。

论坛徽章:
0
发表于 2010-03-18 22:42 |显示全部楼层
问题在你调用的方式。 你外面应该给的是一个stack

不信 你在你的函数第一行sleep 10 秒还是会崩溃的。

论坛徽章:
0
发表于 2010-03-23 21:05 |显示全部楼层
谢谢了,但是我还是不明白,能在说得清楚点吗?

论坛徽章:
0
发表于 2010-03-25 14:19 |显示全部楼层
这样解释不知道你明白不:

你传入的是一个变量的指针, 这个变量在线程创建完了之后可能就没了,所以这个地址就没有意义了。

其实严格意义上来说,这种做法很危险,除非你保证你的那个int *sock_fd指向的是个全局的玩意,而且不变,否则都会有问题。

对于这种东西,建议传入一个new出来的结构,在线程退出时delete比较合适。原则就是:为谁用,谁new,谁delete。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP