Подключите сокет на localhost на iOS - PullRequest
3 голосов
/ 09 ноября 2011

В моем приложении для iOS я хочу подключить сокет на localhost.Он отлично работает на симуляторе, но не на устройстве.Я создаю сокет, который прослушивает localhost:

// create local socket 
SOCKET newSocket = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in localaddr;
localaddr.sin_family = AF_INET; 
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);    
localaddr.sin_port = htons(8080);
if (bind(newSocket, (struct sockaddr*)&localaddr, sizeof(localaddr)) != 0)
{    
    NSLog(@"bind main socket failed: %s", strerror(errno));
    return INVALID_SOCKET;
}
if(listen(newSocket, MAX_PENDING_SOCKETS) != 0)
{
    NSLog(@"listen main socket failed: %s", strerror(errno));
    return INVALID_SOCKET;
}

В другой части моего приложения я создаю другой сокет и пытаюсь подключить его на localhost:

SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in remoteaddr = {0};
remoteaddr.sin_family = AF_INET; 
remoteaddr.sin_addr.s_addr = inet_addr("127.0.0.1");   
remoteaddr.sin_port = htons(8080);     

int error = connect(sock, (struct sockaddr*)&remoteaddr, sizeof(remoteaddr));

Этот код работает нормальнона симуляторе.Но на устройстве я получаю сообщение об ошибке: «Нет такого файла или каталога».

Этот код неверен?Или это ограничение iOS?

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ:

Кажется, что установка параметра сокета SO_USELOOPBACK решает проблему:

int sockopt=1;
if(setsockopt(sock, SOL_SOCKET, SO_USELOOPBACK, (char*)&sockopt, sizeof(sockopt)))
    NSLog(@"error on setsockopt SO_USELOOPBACK: %s", strerror(errno));

1 Ответ

1 голос
/ 23 сентября 2015

Симулятор работает на той же машине (localhost), но не на устройстве. Для устройства вам, вероятно, нужно подключиться, используя IP-адрес вашего компьютера, а не «localhost» / «127.0.0.1»

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...