Здесь происходит сбой:
file_descriptor=getaddrinfo(NULL,PORT,&hints,&p);
printf("%s",inet_ntop(AF_INET,p->ai_addr,ip,addrlen));
Обратите внимание, что во второй строке вы разыменовываете указатель p
- но p
равен NULL, поскольку getaddrinfo()
не выполнен и не установленэто допустимый адрес, поэтому попытка разыменования вызывает неопределенное поведение, и в этом случае вызывает сбой.
Кстати, я смог отладить это, вставив временные операторы printf()
в различных точках программы ивидя, что (или не) было напечатано.В частности:
printf("k1\n");
file_descriptor=getaddrinfo(NULL,PORT,&hints,&p);
printf("k2 file_descriptor=%i p=%p\n", file_descriptor, p);
printf("%s",inet_ntop(AF_INET,p->ai_addr,ip,addrlen));
printf("k3\n");
... когда я бегал с таким кодом, я видел такой вывод:
k1
k2 file_descriptor=12 p=0x0
Segmentation fault: 11
... что делает проблему очевидной - p былоNULL (он же 0x0) в строке "k2", и сбой произошел до того, как была напечатана строка "k3", так что сбой был определенно в вашем вызове printf()
и из-за разыменования NULL-указателя.
Чтобы исправить сбой, вам нужно проверить возвращаемое значение getaddrinfo()
, чтобы убедиться, что он вернул ноль / успех, и обработать его корректно, когда он возвращает ненулевое значение / ошибка, вместо того, чтобы просто предполагать, что он всегда будет успешным,(как правило, это нужно делать со всеми вызовами функций, которые возвращают значение успеха / сбоя)