snowpino 2013-10-10 01:51 采纳率: 0%
浏览 2743

UDP套接字绑定端口0时为什么父进程可以打印出内核分配的端口号而子进程不可以?

以下是我用来测试父子进程创建UDP套接字并绑定0端口并打印套接字地址和端口号的程序,其中getsockname只是用来打印出端口号和IP地址。我分别在父子进程都创建了UDP套接字并绑定0端口(由内核分配端口号),但输出结果是只有在父进程才能输出端口号和IP地址,子进程输出的端口号和IP地址都是0,不知为何,求解答!

#include "unp.h"

void getsockpeername(int sockfd)
{
struct sockaddr_in IPclient,IPserver;
socklen_t len_cli,len_srv;
char str1[20],str2[20];
bzero(&IPclient,sizeof(IPclient));
bzero(&IPserver,sizeof(IPserver));

if(getsockname(sockfd,(SA*)&IPclient,&len_cli)<0)
{
    perror("get socket name error\n");
}
int IPclient_port=ntohs(IPclient.sin_port);
printf("The server port number generated by kernel is %d\n",IPclient_port);
Inet_ntop(AF_INET,&IPclient.sin_addr,str1,sizeof(str1));
printf("The IPserver is %s\n",str1);

}

int main(int argc, char **argv)
{
pid_t pid;
int new_sockfd1;
new_sockfd1 = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in srvaddr;
unsigned long ipserver = 0x82f501b6;
bzero(&srvaddr,sizeof(srvaddr));
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = ipserver;
srvaddr.sin_port = htons(0);

bind(new_sockfd1, (SA *)&srvaddr, sizeof(srvaddr));

getsockpeername(new_sockfd1);
if((pid=fork())<0)
{
    perror("fork failed\n");
    exit(1);
}
if(pid==0)
{
        int new_sockfd2;
        new_sockfd2 = socket(AF_INET, SOCK_DGRAM, 0);

        struct sockaddr_in srvaddr1;
        unsigned long ipserver = 0x82f501b6;
        bzero(&srvaddr1,sizeof(srvaddr1));
        srvaddr1.sin_family = AF_INET;
        srvaddr1.sin_addr.s_addr = ipserver;
        srvaddr1.sin_port = htons(0);

        bind(new_sockfd2, (SA *)&srvaddr1, sizeof(srvaddr1));

        getsockpeername(new_sockfd2);

}
return 0;

}

  • 写回答

1条回答 默认 最新

  • gqtcgq 2015-04-27 05:07
    关注

    父子进程绑定同样的地址,不设置SO_REUSEADDR的话,子进程的绑定肯定会失败,测试一下子进程中的bind函数的返回值。

    评论

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误