getsockname返回无效地址 [英] getsockname return invalid address

查看:194
本文介绍了getsockname返回无效地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用fork创建了一堆子代,在每个子代中,创建一个UDP端口并通过TCP将其发送回父代,但问题是当子代数增加到9时,getsockname()函数为每个孩子返回端口号0.

i used fork to create a bunch of children, in each child, create a UDP port and send it back to the parent by TCP, but the problem is that when the number of children increased to 9, the getsockname() function returns port num 0 for each child.

int udp_sockfd;
struct sockaddr_in their_addr, my_addr;
socklen_t slen;//used in getsockname()
if((udp_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
        perror("socket");
        exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(0);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), sizeof(my_addr.sin_zero));
if(bind(udp_sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
    perror("bind");
    exit(1);
}

getsockname(udp_sockfd,(struct sockaddr*)&my_addr,&slen);
printf("client %d: my port number: %d\n",i,my_addr.sin_port);

当有8个孩子时,结果是正确的

when there are 8 children, the result is correct

推荐答案

您需要初始化getsockname()的slen参数,并且应该检查其返回值-以便在失败时获取更多信息. /p>

You need to initialize the slen argument to getsockname() , and you should check its return value - so you can get more information if it fails.

slen = sizeof my_addr;
if (getsockname(udp_sockfd,(struct sockaddr*)&my_addr,&slen) != 0) {
   perror("getsockname");
}

这篇关于getsockname返回无效地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆