在《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函数了。
转载于:https://blog.51cto.com/hitluo20110426/555723