· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.NETWORKS —› Определить сбой при приеме данных на сокет

Посл.отвђт Сообщенiе


Дата: Июн 2, 2004 21:18:25

Принимаются данные на сокет таким образом:

- в процедуре окна:
readcompare:
        cmp     lparam,FD_READ
        jnz	closecompare
        call    SetEvent,HDataReciveEvent
        ret     0
closecompare:
        cmp     lparam,FD_CLOSE
        jnz     @ret_00
        call    SetEvent,HWaitCloseEvent
;сокет закрывается с отправляющей стороны, если все данные были отправлены
@ret_00:
        ret     0


- тред получения данных:
ReciveThread     proc parametr:dword
        mov      edi,parametr
InfinityLoop:
        call     WaitForSingleObject,dword ptr [edi],-1
;ожидаем установление события получения порции данных
        mov      esi,[edi+8]
;тут буфер для данных
        add	 esi,[edi+12]
;здесь количество уже принятых
        call     recv,dword ptr [edi+16],esi,4096,0
;получаем не более 4096 байт
        add      [edi+12],eax
        jmp      InfinityLoop
;опять в ожидание
ReciveThread     endp


- в основном потоке программы:
        call    WaitForSingleObject,HWaitCloseEvent,-1
;т.е. ждем установления события закрытия сокета с передающей стороны, по
;этому событию определяем, что все данные переданы.


Сам вопрос такой, - вот я жду в основном потоке окончания получения данных, как можно заметить в WaitForSingleObject, параметр времени ожидания выставлен в бесконечность, т.к. я не знаю какого объема будут получены данные, даже если бы и знал смысл не меняется, так вот, если вдруг происходит сбой при передачи, вся эта конструкция стопорится, т.к. на окно не приходит сообщение о закрытии сокета с отправляющей стороны, как мне опредилить что произошла ошибка?
З.Ы.Вообще, это протокол ftp - соединение данных


Дата: Июн 10, 2004 12:30:26

Насколько я знаю, в случае ошибки при передаче данных с удаленного хоста, должно прийти уведомление о получении данных а recv должна вернуть SOCKET_ERROR или 0.
Причём SOCKET_ERROR - это не всегда фатально, надо смотреть WSAGetLastError и код ошибки, т.к. например WSAEWOULDBLOCK это лишь просьба подождать.


Дата: Июн 10, 2004 20:07:07

Уведомление в получении данных не приходит, скорее всего ты говоришь о сокетах в режиме блокирования, тогда да - если при получении данных будет сбой, функция recv выйдет из ожидания и вернет 0, при неблокирующих сокетах при сбое получающей стороне об этом никак не сообщается (или я просто не знаю как сообщается). Что касается моего вопроса - все оказалось просто - ftp-сервер, к которому мы приконектились ессно узнает о разрыви соединения при попытке слить на свой сокет данные для клиента... и соответственно шлет по управляющему соединению сообщение об ошибке, что я и проверяю. З.Ы. если мое письмо, отправленное на wasm@wasm.ru удачно достигло адресата, то возможно скоро появится (а может и не появится) небольшая статья по поводу ftp-протокола+winsocks.


Дата: Июн 10, 2004 20:38:32

2Flip[т.к. например WSAEWOULDBLOCK это лишь просьба подождать.]

Что касается этой ошибки при выполнение recv. Возникает она при попытке прочитать данные с неблокированого сокета, когда их там еще нет, и сообщает не о том, что надо подождать, а о том, что вообще операция recv с неблокирующим сокетом должна проводится только после получения уведомления о том, что данные получены сокетом. Хотя конечно суть все равно сводится к ожиданию данных, но проверка неблокируещего сокета на получение данных ч/з промежутки времени по меньшей мере не рациональна, для этого существует механизм событий.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.073