На стороне сервера моей программы, когда программа нажимает на функцию accept, она ждет соединения. После того, как найден входящий доступ (после подключения к нему с моим клиентом), метод accept() возвращает 1. На основе этого возврата он пытается получить и отправить в сокет 1, который является неправильным сокетом.
Вот код с моего сервера:
for(;;)
{
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR)
После установления соединения sConnect имеет значение 1.
Почему это происходит? И как это исправить?
Поскольку вы сравниваете возвращаемое значение accept
с помощью SOCKET_ERROR
и присваиваете ему значение boolean для sConnect
:
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR)
Лично мне не нравятся такие длинные очереди. Отделите назначение и сравнение:
sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != SOCKET_ERROR )
...
или добавить скобки по крайней мере.
В 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 )
Попробуй это:
sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != INVALID_SOCKET)