2009-12-10 6 views
4

Linux GCC 4.4.2гнездо возврата «Нет такого файла или каталога»

Я делаю некоторые сокет программирования.

Однако, я получаю эту ошибку, когда я пытаюсь присвоить sockfd из функции сокета .

" Socket operation on non-socket" 

Большое спасибо за любые советы,

#if defined(linux) 
#include <pthread.h> 
/* Socket specific functions and constants */ 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <errno.h> 
#endif 

#include "server.h" 
#include "cltsvr_ults.h" 

/* Listens for a connection on the designated port */ 
void wait_client() 
{ 
    struct addrinfo add_info, *add_res; 
    int sockfd; 

    /* Load up the address information using getaddrinfo to fill the struct addrinfo */ 
    memset(&add_info, 0, sizeof(add_info)); 
    /* Use either IPv4 or IPv6 */ 
    add_info.ai_family = AF_UNSPEC; 
    add_info.ai_socktype = SOCK_STREAM; 
    /* Fill in my IP address */ 
    add_info.ai_flags = AI_PASSIVE; 

    /* Fill the struct addrinfo */ 
    int32_t status = 0; 
    if(status = getaddrinfo(NULL, "6000", &add_info, &add_res) != 0) 
    { 
     fprintf(stderr, "getaddrinfo [ %s ]\n", gai_strerror(status)); 

     return; 
    } 

    if((sockfd = (socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol)) == -1)) 
    { 
     fprintf(stderr, "Socket failed [ %s ]\n", strerror(errno)); 

     return; 
    } 

    /* Bind to the port that has been assigned by getaddrinfo() */ 
    if(bind(sockfd, add_res->ai_addr, add_res->ai_addrlen) != 0) 
    { 
     fprintf(stderr, "Bind failed [ %s ]\n", strerror(errno)); 

     return; 
    } 

    printf("Listening for clients\n"); 
} 

Edit == кодирование в старом - школьный метод

int32_t sockfd = 0; 
    struct sockaddr_in my_addr; 

    memset(&my_addr, 0, sizeof(my_addr)); 

    my_addr.sin_family = AF_INET; 
    my_addr.sin_port = htons(6000); 
    my_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    sockfd = socket(PF_INET, SOCK_STREAM, 0); 
    if(sockfd == -1) 
    { 
    fprintf(stderr, "Socket failed [ %s ]\n", strerror(errno)); 
    return; 
    } 

    if(bind(sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) == -1) 
    { 
    fprintf(stderr, "Bind failed [ %s ]\n", strerror(errno)); 
    return; 
    } 
+0

@robUK есть особая причина, почему вы используете 'getaddrinfo' вместо того, чтобы делать равнину' сокет (AF_INET, SOCK_STREAM, 6000) ; '? – RageZ

+0

Ну, я использовал getaddrinfo, поскольку это самый современный способ сделать это, иначе он устарел. Я использую ссылку Beej. Благодарю. – ant2009

+0

RageZ: '6000' не является подходящим значением для третьего параметра сокета. – caf

ответ

12

Основная проблема заключается в том, что у вас неправильная проверка, если у socket() есть ошибка. socket() вернет -1 при ошибке, а не 0 при успехе. Вы можете получить хорошее значение сокета (2, 3 и т. Д.) И рассматривать его как ошибку.

Существует также вторая проблема в том, как вы скопируете свой код в скобки. Когда вы пишете:

if (sockfd = socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol) != 0) 

Это лечится как:

if (sockfd = (socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol) != 0)) 

Так sockfd не будет присвоено значение, возвращаемое гнездо, но значение, сравнивая его с 0. Закрепление обе проблемы, вы следует написать:

if ((sockfd = socket(add_res->ai_family, add_res->ai_socktype, add_res->ai_protocol)) == -1) 
+0

Спасибо. Это было правильно. Однако теперь я получаю сообщение об ошибке «Операция сокета на не-сокет». Я редактировал свой код с вашей правильной строкой. Любая причина, по которой я получаю эту ошибку? Большое спасибо – ant2009

+0

@roboUK - вы уверены, что получаете эту ошибку из кода, который вы опубликовали как «Изменить». Когда я компилирую этот фрагмент и запускаю его, он работает нормально. –

0

Я считаю, что вы должны указать тип разъема, который хотите. Когда вы говорите:

add_info.ai_family = AF_UNSPEC; 

вы должны сказать:

add_info.ai_family = AF_INET; 
+0

Я изменил эту строку кода на AF_INET, но все равно получаю ту же ошибку. – ant2009

+0

Я не уверен, что ваш звонок в getaddrinfo() также правильный. почему бы вам просто не следовать одному из многих примеров «старой школы», как использовать сокет. – 2009-12-10 13:37:01

+0

Здравствуйте, я редактировал свой исходный код, чтобы включить метод старой школы. Это сработало нормально. Тем не менее, мне все еще интересно узнать, почему использование getaddrinfo() не удалось? Большое спасибо, – ant2009

Смежные вопросы