0

在 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");
}

请帮忙。

4

2 回答 2

0

原来我需要将 struct 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");
}
于 2013-05-20T16:49:56.147 回答
0

您将套接字绑定到的地址(IPv4 中的 localhost AKA 127.0.0.1)是您认为自己的地址。您需要将套接字绑定到网络上其他人认为您的地址。

ipconfig您可以使用或其他系统实用程序获取此地址。或者,您可以将其绑定到“任何”地址。

sin.sin_addr.s_addr = INADDR_ANY;
于 2013-05-20T16:50:33.930 回答