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函数的返回值。

    评论

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 flask项目,怎么使用AJAX传数据库数据到echarts图表的data里,实现异步加载数据。
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题