Windows-сокеты accept () возвращают неверное значение

0

На стороне сервера моей программы, когда программа нажимает на функцию accept, она ждет соединения. После того, как найден входящий доступ (после подключения к нему с моим клиентом), метод accept() возвращает 1. На основе этого возврата он пытается получить и отправить в сокет 1, который является неправильным сокетом.

Вот код с моего сервера:

for(;;)
{
   if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)  != SOCKET_ERROR) 

После установления соединения sConnect имеет значение 1.

Почему это происходит? И как это исправить?

Теги:
networking
sockets

3 ответа

3
Лучший ответ

Поскольку вы сравниваете возвращаемое значение accept с помощью SOCKET_ERROR и присваиваете ему значение boolean для sConnect:

if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)  != SOCKET_ERROR) 

Лично мне не нравятся такие длинные очереди. Отделите назначение и сравнение:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != SOCKET_ERROR )
...

или добавить скобки по крайней мере.

5

В Windows, если accept() терпит неудачу, он возвращает INVALID_SOCKET, а не SOCKET_ERROR.

Реальная проблема заключается в if() оператор if() выполняет одновременно как назначение, так и сравнение, но ему не хватает требуемого набора скобок для назначения, поэтому он фактически сравнивает другое значение, чем вы ожидаете. Сделайте это вместо этого:

if( (sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)) != INVALID_SOCKET )

Лучший вариант - отделить назначение и сравнение:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != INVALID_SOCKET )  
1

Попробуй это:

sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect  != INVALID_SOCKET)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню