Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно закрыть сокет? На WinApi 
:(
    Опции темы
danilsl
Дата 27.6.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 15.3.2006

Репутация: нет
Всего: нет



Привет всем.
Пишу прогу клиент-сервер. Общаются они через сеть. Сетевое взаимодействие делаю через WinApi и WinSock2.
В общем такая проблема. Соединение нормально устанавливается, данные нормально передаются. Далее передаю на сервер команду завершения сеанса. Сервер на неё отвечает согласием и вызывает со своей стороны CloseSocket. Соответственно клиент после отправки команды завершения сеанса ждёт подтверждения и тоже со своей стороны закрывает сокет. Если клиент и сервер выполняются на разных машинах, всё проходит нормально. Если же на одной, то после отправки сервером подтверждения и закрытия сокета, клиент вываливается на recv, ждущей подтверждения от сервера. WSAGetLastError выдаёт 10058. MSDN эту ситуацию коментирует так: Cannot send after socket shutdown. Я так понимаю, что сегмент FIN должен передаваться после подтверждения, и следовательно клиент просто обязан подтверждение прочитать. Единственное, что приходит в голову в этой ситуации, что винда на одной машине при выполнении send пишет сразу в буфер recv на другом конце, минуя транспорт IP. Соответственно, вызывая CloseSocket на одном конце, я грохаю приёмный буфер на другом, ещё до прочтения.
Есть ли другие способы завершения соединения, чтобы данные, посланые после закрытия сокета на одном конце, были гарантировано прочитаны на другом?
PM MAIL   Вверх
misha_mike
Дата 30.6.2007, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 1.6.2007

Репутация: 1
Всего: 1



Нехорошо заставлять recv ждать данных, именно поэтому нехорошо. Его вызывать нужно когда данные уже пришли, а момент прихода данных, как и факт окончания связи отлавливать при помощи сообщений WSA (см. WSAAsyncSelect). Ну или ioctlsocket, если WSA по каким-либо причинам не подходит. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.7352 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.