簡體   English   中英

iOS套接字綁定錯誤49無法分配請求的地址

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM