2013-05-20 38 views
0

當在iOS項目中使用綁定功能,它給我的錯誤「無法分配請求的地址」(#49)的iOS套接字綁定錯誤49不能分配請求的地址

下面是代碼:

struct sockaddr_in sin; 
sin.sin_family  = AF_INET; 
sin.sin_port  = htons(local_port); 
sin.sin_addr.s_addr = inet_addr("127.0.0.1"); 
socklen_t sinlen = sizeof(sin); 

char sockopt = 1; 
setsockopt (listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); 
//setsockopt (listensock, SOL_SOCKET, SO_USELOOPBACK, &sockopt, sizeof(sockopt)); 

if (::bind(listensock, (struct sockaddr *)&sin, sinlen) == -1) 
{ 
    BOOST_LOG(lg) << bf("bind error: %s (%d)", strerror(errno), errno) << std::endl; 
    throw std::runtime_error ("Error establishing tunnel: -3"); 
} 

請幫忙。

+0

我也試過使用不同的地址(不同於本地主機)和不同的端口。 – Chris

回答

0

原來我需要清零結構sockaddr_in .... 這是可用的代碼。

struct sockaddr_in sin; 
memset(&sin, 0, sizeof(sin)); 
sin.sin_family  = AF_INET; 
sin.sin_port  = htons(local_port); 
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 
socklen_t sinlen = sizeof(sin); 

char sockopt = 1; 
//setsockopt (listensock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); 
setsockopt (listensock, SOL_SOCKET, SO_USELOOPBACK, &sockopt, sizeof(sockopt)); 

if (::bind(listensock, (struct sockaddr *)&sin, sinlen) == -1) 
{ 
    BOOST_LOG(lg) << bf("bind error: %s (%d)", strerror(errno), errno) << std::endl; 
    throw std::runtime_error ("Error establishing tunnel: -3"); 
} 
+1

此代碼可能會運行,但我不確定其他計算機是否能夠使用回送到達您。 – LodeRunner

+0

@LodeRunner:不,但綁定到回送是限制對來自同一臺計算機的連接的訪問​​的標準方法。 –

0

你的插座綁定到地址(本地主機AKA在IPv4中127.0.0.1)的地址是你認爲自己是。您需要將套接字綁定到網絡上其他人看到的地址。

您可以使用ipconfig或其他系統實用程序獲取此地址。或者,您可以將其綁定到「任何」地址。

sin.sin_addr.s_addr = INADDR_ANY; 
相關問題