【问题标题】:error in binding port "Address already in use" TCP socket programming in unix绑定端口“地址已在使用”中的错误 TCP 套接字编程在 unix 中
【发布时间】:2012-03-01 17:48:11
【问题描述】:

我浏览过很多帖子和论坛,而且我是套接字编程的新手。我的代码的主要部分类似于 BIND ERROR : Address already in use

但后来我更改了代码,以便像这样包含“setsockopt”函数:

const char* port="5555";
int opt=1;
portno=atoi(port);
//parameters for server address
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(portno);
serv_addr.sin_addr.s_addr=INADDR_ANY;
//bind the socket to the address
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(const char *)&opt,sizeof(int));


 if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
{close(sockfd);
error("error in binding port!");
}

但我仍然得到错误。我必须关闭终端并重新启动它才能再次使用该端口。我想使用硬编码的端口(就像我在上面的代码中提到的那样)

                                                            Thanks a lot in advance

【问题讨论】:

  • 检查setsockopt返回的值。
  • 你确定你在某处没有挥之不去的进程吗?
  • 绑定失败时setsockopt的返回值为0,但如果服务器up则不显示返回值。

标签: c sockets unix tcp


【解决方案1】:

检查端口是否在使用中。 telnet 到该端口或使用 netstat -a。它应该正在使用中(如错误所示)并终止相应的进程。也许使用ps 来查找进程。

【讨论】:

  • netstat -natp 显示我的服务器仍然处于活动状态 tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN 24328/server
【解决方案2】:

一个端口号一次只能由一个应用程序使用。这意味着您不能两次启动同一个程序,期望两者都绑定到同一个端口。

SO_REUSEADDR是当绑定到某个地址的socket已经关闭时,可以直接再次使用相同的地址(ip-address/port pair)。

【讨论】:

  • 在我的代码中(如上所述),我设置了关闭套接字的条件,以防绑定失败。我还检查了 setsockopt 的返回值为 0。
  • @arvind 在对 Eds 回答的评论中,您说您的程序仍然处于活动状态。您必须先停止当前正在运行的程序,然后才能再次运行它,就像我在回答中所说的那样。端口号不能被多个程序共享。
  • 所以我必须杀了它。有没有办法我可以重用端口而不杀死它?关闭文件描述符是否不足以关闭连接并重用它?
  • @arvind 是的,关闭套接字就足够了。
  • 但在我的代码中,条件是如果绑定失败,那么我使用关闭文件描述符“close(sockfd)”发出错误“绑定错误”然后退出不会照顾我关闭插座?在我看来,重新执行的程序应该有一次在关闭套接字时出现错误,但在另一次重新执行时应该可以正常工作。但事实并非如此。请帮帮我
猜你喜欢
  • 2016-09-22
  • 2015-07-25
  • 2021-05-21
  • 2013-07-01
  • 2023-03-20
  • 2011-09-16
  • 2012-04-27
  • 2014-11-03
  • 2015-05-26
相关资源
最近更新 更多