2012-02-09 36 views
2

我已经经历了许多帖子和论坛,我是新的套接字编程。我的代码主要部分类似于 BIND ERROR : Address already in use错误在绑定端口“地址已在使用”unix中的TCP套接字编程

但后来我改变了我的代码,这样我有“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 
+0

检查'setsockopt'返回的值。 – cnicutar 2012-02-09 08:56:17

+0

你确定你没有一个挥之不去的进程吗? – 2012-02-09 08:56:59

+0

当绑定失败时,setsockopt的返回值为0,但是如果服务器启动,则不显示返回值。 – arvind 2012-02-09 09:38:55

回答

1

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

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

+0

在我的代码中(如上所述)我把条件关闭套接字以防绑定失败。我也检查了setsockopt的返回值是0. – arvind 2012-02-09 09:27:38

+0

@arvind在对Eds的回答中,你说你的程序仍然是活动的。您必须先停止当前正在运行的程序,然后才能再次运行它,就像我在回答中声明的那样。端口号不能被多个程序共享。 – 2012-02-09 09:49:40

+0

所以我必须杀死它。我有没有办法在不杀死它的情况下重用端口?是不关闭文件描述符足以关闭连接并重新使用它? – arvind 2012-02-09 09:58:03

3

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

+0

netstat -natp显示我的服务器仍然处于活动状态tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN 24328/server – arvind 2012-02-09 09:29:28

相关问题