send (), возвращает Winsock Ошибка 10038 - PullRequest
0 голосов
/ 23 февраля 2009

Проблема:

  • Вызов send () , возвращает ошибку Winsock 10038 против дескриптора сокета

Иллюстрация:

acceptedSocket = accept (server, (sockaddr *)&sin, &len);
  • accept () , возврат 0
    • Новый поток , создается для каждого соединения
    • send () , (в функции потока) возвращает 10038

Иллюстрация: - в функции резьбы

//omitted
SOCKET RemoteSocket = (SOCKET) client;
//omitted
send (RemoteSocket, stringToSpend, strlen(stringToSpend), 0)

Предложения:

  • Возможно, состояние гонки?
  • Может использовать порты завершения ввода / вывода, но не на этом этапе

Ответы [ 3 ]

2 голосов
/ 23 февраля 2009

Не проблема в линии

acceptedSocket = accept (server, (sockaddr *)&sin, &len) == INVALID_SOCKET)

Вы делаете acceptedSocket результатом сравнения, но вы должны как-то сохранить фактический сокет, возвращенный из accept:

acceptedSocket = accept (server, (sockaddr *)&sin, &len);
isOK= acceptedSocket!=INVALID_SOCKET;

Хотя меня немного смущают несбалансированные скобки в вашем посте, поэтому я могу ошибаться

2 голосов
/ 23 февраля 2009

accept () возвращает вам дескриптор нового сокета, специфичного для соединения. для серверного кода задействовано 2+ сокета: один находится в состоянии прослушивания, для которого вы вызываете accept (), а второй возвращается из accept () - это сокет входящего соединения. После accept () может вернуть сокет для второго входящего соединения и т. Д., Если accept () возвращает 0, это не входящее соединение - это ошибка.

0 голосов
/ 23 февраля 2009

Хм, похоже, ваш send выполняется слишком быстро, прежде чем accept произошло. Поэтому сокет, используемый в send, недействителен в момент выполнения send. Одна из неприятных особенностей многопоточности. Вам нужно дождаться события в потоке send и запустить событие, когда произойдет принятие

...