function T_Socket.RecvData: String;
var res: Integer;
var i: Integer;
begin
if Connected=False then begin
Error('нет соединения');
end;
Result:='';
repeat
res := recv(Sock, buff, SizeOf(buff)-1, 0);
if res=SOCKET_ERROR then begin
Error('Ошибка сокета');
buff[1]:=#0;
end else begin
buff[res+1]:=#0;
end;
Result:=Result+String(pchar(@buff[1]));
if EndOfLine='' then break;
if pos(EndOfLine, Result)>0 then break;
Until False;
end;
Зависание программы в функции recv
Подскажите пожалуйста, где в данном тексте есть ошибка. По непонятной мне причине, программа при переходе в режим ожидания сообщений зависает. Очень надеюсь на вашу помощь. Необходимо приложение для приема и передачи сообщений через сокеты. Полностью текст предоставлять не буду, но если надо, могу. Здесь предоставлен кусок, в котором происходит зависание
Код:
Зависает когда? recv не возвращает управление или не выходит из цикла? А почему не обрабатывается ситуация, когда recv может возвратить 0? В справке по этой функции описаны все возможные возвращаемые значения ;)
Цитата: makbeth
Зависает когда? recv не возвращает управление или не выходит из цикла? А почему не обрабатывается ситуация, когда recv может возвратить 0? В справке по этой функции описаны все возможные возвращаемые значения ;)
Результат выполнения команды recv SOCKET_ERROR
Конкретная ошибка: WSAGetLastError()=WSAEWOULDBLOCK
WSAEWOULDBLOCK - предполагает ожидание передачи, а у меня зависает.
Да и какие нибудь брандмауеры/файерволлы/и_прочая_антивирусная_хрень ничего не блокируют?
Файрволы и антивирусы не блокируют.
Команды send, connect, disconnect отрабатываются отлично. Только с recv проблема :(
Код:
if EndOfLine='' then break;
if pos(EndOfLine, Result)>0 then break;
if pos(EndOfLine, Result)>0 then break;
не работали.
И как ты решил его?