Socket API: работа с сокетом без сокета

Здравствуйте, у меня проблема, когда я пишу сервер, используя API сокета. Я всегда получаю эту ошибку: «Операция сокета без сокета»

struct sockaddr_in addr;
int port = 10000;
int sd;

memset((char *) &addr,0, sizeof(addr));
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htonl((u_short)port);

if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {

    printf("socket failed");
}

if(bind(sd, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
    printf(strerror(errno));
}

close(sd);


return 0;}

person Chadi Helwe    schedule 26.02.2015    source источник
comment
Если вы получили сообщение об ошибке, (а) не просто печатайте какое-то сообщение собственной разработки: используйте perror() или strerror(), и (б) не продолжайте, как если бы ошибки не было. И не правильно тестировать системные вызовы для != 0: правильный тест это == -1 или < 0.   -  person user207421    schedule 27.02.2015


Ответы (2)


Линия:

if ((sd = socket(PF_INET, SOCK_STREAM, 0) < 0)) {

Не делает то, что вы думаете. Если вы внимательно посмотрите на размещение скобок (и помните, что оператор < имеет более высокий приоритет, чем =), вы заметите, что фактически присваиваете sd значение выражения socket(PF_INET, SOCK_STREAM, 0) < 0.

Короче говоря, sd, скорее всего, в конечном итоге будет содержать значение 0, потому что это то, что обычно оценивает приведенное выше выражение. Это объясняет ошибку «операция сокета без сокета»; это действительно не розетка.

Таким образом, строка должна выглядеть так:

if ((sd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {

Обратите внимание, как я сдвинул закрывающую скобку влево на две лексемы.

person Martin Törnwall    schedule 26.02.2015

addr.sin_port = htonl((u_short)port);

должен прочесть

addr.sin_port = htons((u_short)port);

так как порт 16-битный номер.

person Stian Skjelstad    schedule 14.05.2018