在iOS项目中使用bind函数时,它给出了错误“无法分配请求的地址”(#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 :(得分: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");
}
答案 1 :(得分:0)
您将套接字绑定到的地址(IPv4中的localhost AKA 127.0.0.1)是您自己看到的地址。您需要将套接字绑定到网络上其他人看到的地址。
您可以使用ipconfig
或其他系统实用程序获取此地址。或者,您可以将其绑定到“任何”地址。
sin.sin_addr.s_addr = INADDR_ANY;