[英]iOS socket bind error 49 can't assign requested address
在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");
}
請幫忙。
原來我需要將結構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");
}
您將套接字綁定到的地址(IPv4中的localhost AKA 127.0.0.1)就是您看到的地址。 您需要將套接字綁定到網絡上其他人看到的地址。
您可以使用ipconfig
或其他系統實用程序獲取此地址。 或者,您可以將其綁定到“任何”地址。
sin.sin_addr.s_addr = INADDR_ANY;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.