2010-02-02 59 views
0

我有以下代码:如何在MacOSX/Ubuntu中重新绑定套接字?第二次

if ((m_mainSocket = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 
{ 
    throw Exception(__FILE__, __LINE__) << "Unable to create socket"; 
} 

int on(0); 

if (setsockopt(m_mainSocket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) 
{ 
    throw Exception(__FILE__, __LINE__) << "Can't make server socket resusable."; 
} 

sockaddr_in addr; 
memset(&addr, 0, sizeof(addr)); 

addr.sin_family = AF_INET; 
addr.sin_addr.s_addr = htonl(INADDR_ANY); 
addr.sin_port = htons(p_localPort); 

if (::bind(m_mainSocket, reinterpret_cast< sockaddr * >(&addr), sizeof(addr)) < 0) 
{ 
    throw Exception(__FILE__, __LINE__) << "Failed to bind the server socket"; 
} 

当我关闭服务器,有近(),淡然的,我不能再在同一个端口打开服务器。为什么?我需要更改端口或重新启动系统。它只发生在Ubuntu和MacOSX中。在Windows中,我没有这个问题。

:: bind()函数中发生错误。它不允许我重新绑定()套接字两次。

如何重新绑定?

回答

4

您需要将1而不是0传递给REUSEADDR。

socket(7)手册页:

 
    Socket Options 
     These socket options can be set by using setsockopt(2) and read with 
     getsockopt(2) with the socket level set to SOL_SOCKET for all sockets: 

     .... 

     SO_REUSEADDR 
       Indicates that the rules used in validating addresses supplied 
       in a bind(2) call should allow reuse of local addresses. For 
       AF_INET sockets this means that a socket may bind, except when 
       there is an active listening socket bound to the address. When 
       the listening socket is bound to INADDR_ANY with a specific port 
       then it is not possible to bind to this port for any local 
       address. Argument is an integer boolean flag. 
+0

谢谢!我做的。它适用于MacOS,但Ubuntu仍然有同样的问题。没有改变。 – 2010-02-04 16:48:23

相关问题