Приветствую! Дело происходит в Delphi 2007.
создаю udp сокет:
| Код | var i : integer; ad : TSockAddr; adLen : integer; NonBlockArg : integer; ... // создаём сокет fSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if fSocket = INVALID_SOCKET then begin DoEventError('ошибка при создании сокета: ' + suGetLastErrorString); Exit; end; // перевод сокета в неблокирующий режим NonBlockArg := 1; if ioctlsocket(fSocket, FIONBIO, NonBlockArg) = SOCKET_ERROR then begin closesocket(fSocket); DoEventError('ошибка при переводе сокета в неблокирующий режим: ' + suGetLastErrorString); Exit; end; // формируем адрес FillChar(ad.sin_zero, SizeOf(ad.sin_zero), 0); ad.sin_family := AF_INET; ad.sin_addr.S_addr := INADDR_ANY; ad.sin_port := 0; // привязываем сокет к адресу if bind(fSocket, ad, sizeof(ad)) = SOCKET_ERROR then Exit;
|
Затем передаю его в отдельную нить, где происходит чтение в цикле от таким образом:
| Код | // приём addrLen := sizeof(fAddrFrom); fRecvRes := recvfrom(fSocket, fRecvBuf[0], c_RECV_BUF_SIZE, 0, fAddrFrom, addrLen); if fRecvRes > 0 then begin // приём успешен SetLength(fRecvData, fRecvRes); move(fRecvBuf[0], fRecvData[0], fRecvRes); Synchronize(DoOnData); end // ошибка else if WSAGetLastError <> WSAEWOULDBLOCK then begin fErrStr := 'ошибка при получении данных: ' + suGetLastErrorString; fCmdStop := True; Synchronize(DoOnError); end;
|
Дак вот появляется в этом процессе ошибка, отличная от WSAEWOULDBLOCK. Текст этой ошибки такой: "Удаленный хост принудительно разорвал существующее подключение". Что вопиюще для udp! Заметка: как я заметил, ошибка возникает после того, как я произвожу попытку посылки датаграммы через этот сокет на адрес, который не доступен... Хотя не должно никак влиять на приём. В чём же может быть дело?
Выяснил что это ошибка WSAECONNRESET. Что с этим делать? В других udp приложениях такого небыло... Игнорировать её? |