|
|
| Посл.отвђт | Сообщен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 |