![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| danilsl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 15.3.2006 Репутация: нет Всего: нет |
Привет всем.
Пишу прогу клиент-сервер. Общаются они через сеть. Сетевое взаимодействие делаю через WinApi и WinSock2. В общем такая проблема. Соединение нормально устанавливается, данные нормально передаются. Далее передаю на сервер команду завершения сеанса. Сервер на неё отвечает согласием и вызывает со своей стороны CloseSocket. Соответственно клиент после отправки команды завершения сеанса ждёт подтверждения и тоже со своей стороны закрывает сокет. Если клиент и сервер выполняются на разных машинах, всё проходит нормально. Если же на одной, то после отправки сервером подтверждения и закрытия сокета, клиент вываливается на recv, ждущей подтверждения от сервера. WSAGetLastError выдаёт 10058. MSDN эту ситуацию коментирует так: Cannot send after socket shutdown. Я так понимаю, что сегмент FIN должен передаваться после подтверждения, и следовательно клиент просто обязан подтверждение прочитать. Единственное, что приходит в голову в этой ситуации, что винда на одной машине при выполнении send пишет сразу в буфер recv на другом конце, минуя транспорт IP. Соответственно, вызывая CloseSocket на одном конце, я грохаю приёмный буфер на другом, ещё до прочтения. Есть ли другие способы завершения соединения, чтобы данные, посланые после закрытия сокета на одном конце, были гарантировано прочитаны на другом? |
|||
|
||||
| misha_mike |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 1.6.2007 Репутация: 1 Всего: 1 |
Нехорошо заставлять recv ждать данных, именно поэтому нехорошо. Его вызывать нужно когда данные уже пришли, а момент прихода данных, как и факт окончания связи отлавливать при помощи сообщений WSA (см. WSAAsyncSelect). Ну или ioctlsocket, если WSA по каким-либо причинам не подходит.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |