Основное программирование сокетов в симуляторе iOS

71
10

Я работаю над учебником Beej sockets. Почему вызов в socket ниже не работает в симуляторе iPhone?

    int status;
struct addrinfo hints;
struct addrinfo *servinfo;
char ipstr[INET6_ADDRSTRLEN];

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

if ((status = getaddrinfo("www.yahoo.com",
"80",
&hints,
&servinfo)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}

for(struct addrinfo *p = servinfo; p != NULL; p = p->ai_next) {
void *addr;
char *ipver;

if (p->ai_family == AF_INET) {
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
ipver = "IPv4";
} else {
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
ipver = "IPv6";
}

inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
printf(" %s: %s\n", ipver, ipstr);

int socketfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (socketfd)
printf("errno: %d\n", errno);
}

freeaddrinfo(servinfo);

Вывод вышеуказанного кода:

  IPv4: 72.30.38.140
errno: 2
IPv4: 72.30.2.43
errno: 2

errno 2 No such file or directory. Я не знаю, как это интерпретировать.

спросил(а) 2020-04-03T23:54:42+03:00 5 месяцев, 4 недели назад
1
Решение
92

Ошибка в этой строке:

if (socketfd) {

Это должно быть:

if (socketfd == -1) {

поскольку socket() возвращает -1 при ошибке, а не при успешном завершении (как указано здесь: qaru.site/questions/1296141/...)

ответил(а) 2020-04-04T00:14:40.228966+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема