在《Linux操作系统套接字编程的5个隐患》一文中,隐患3提到如下内容:

 

地址信息

在通常情况下,按照文章中描述的调用setsockopt函数设置端口重用,是可以实现的。但是下面这个情况却有点特殊,出现了设置端口重用,却仍然报错“adress  already in use”(附件中含有错误代码文件).

代码段:

int main()
{
    int i ;
    for(i = 0 ; i < 5 ; i++){
        send_tcp();
    }
   
    return 0 ;
}

那为什么会出现这种情况呢?

       我个人认为是因为bind函数将端口资源分配给main的主进程,而这个进程一直没有被杀掉,资源没有被释放,所以多次绑定的时候出现了。

       所以重复进行调用Bind函数时需要在子进程中进行:

int main()
{
    int cid1 ;
    int cid1s;
   
    cid1 = fork() ;
    if(cid1 ==  -1){
        perror("fork fail..\n");
    }else if(cid1 == 0){
        send_tcp();
        exit(0);
        printf("cid1 call exit.\n");
    }else{
        waitpid(cid1, &cid1s, 0);
        printf("cid1 exit %d\n",cid1s) ;
        send_tcp();
    }
   
    return 0 ;
}
这样就能够实现多次调用send_tcp函数了。