Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Зависание программы в функции recv

19K
12 апреля 2009 года
WantToProg
63 / / 19.01.2009
Программа для работы с сокетами.
Подскажите пожалуйста, где в данном тексте есть ошибка. По непонятной мне причине, программа при переходе в режим ожидания сообщений зависает. Очень надеюсь на вашу помощь. Необходимо приложение для приема и передачи сообщений через сокеты. Полностью текст предоставлять не буду, но если надо, могу. Здесь предоставлен кусок, в котором происходит зависание
Код:
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;
303
12 апреля 2009 года
makbeth
1.0K / / 25.11.2004
Зависает когда? recv не возвращает управление или не выходит из цикла? А почему не обрабатывается ситуация, когда recv может возвратить 0? В справке по этой функции описаны все возможные возвращаемые значения ;)
19K
13 апреля 2009 года
WantToProg
63 / / 19.01.2009
Цитата: makbeth
Зависает когда? recv не возвращает управление или не выходит из цикла? А почему не обрабатывается ситуация, когда recv может возвратить 0? В справке по этой функции описаны все возможные возвращаемые значения ;)



Результат выполнения команды recv SOCKET_ERROR
Конкретная ошибка: WSAGetLastError()=WSAEWOULDBLOCK
WSAEWOULDBLOCK - предполагает ожидание передачи, а у меня зависает.

8.5K
13 апреля 2009 года
FrostFX
121 / / 01.03.2007
Я может не в тему... но это делается в отдельном потоке?
Да и какие нибудь брандмауеры/файерволлы/и_прочая_антивирусная_хрень ничего не блокируют?
19K
13 апреля 2009 года
WantToProg
63 / / 19.01.2009
Да, работает в отдельном потоке, кроме того, сокет не блокируемый.
Файрволы и антивирусы не блокируют.
Команды send, connect, disconnect отрабатываются отлично. Только с recv проблема :(
19K
14 апреля 2009 года
WantToProg
63 / / 19.01.2009
Вопрос решен. Дело в том, что сервер, в данном случае сканер, посылает не побитно данные а пакетом. соответственно условия
 
Код:
if EndOfLine='' then break;

    if pos(EndOfLine, Result)>0 then break;

не работали.
17K
26 июня 2009 года
Alca
2 / / 28.02.2006
>>Вопрос решен.
И как ты решил его?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог