Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка данных через сокет, Отследить РЕАЛЬНОЕ окончание отправки 
:(
    Опции темы
RomkaRomka
Дата 9.9.2005, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!

Столкнулся с такой проблемой: синхронный сокет в блокирующем режиме, соединение установлено. Отправляю данные (send) - возвращается число байт, которое я посылал. Получается данные отправлены. За ненадобностью следом закрываю сокет (closesocket). Смотрю принимающую сторону - пришло не все. Убираю closesocket - приходит все.

В МСДН грится - The successful completion of a send does not indicate that the data was successfully delivered.

Вопрос в том, как можно отследить что данные РЕАЛЬНО ушли?


Заранее благодарен

С уважением, Роман


PM MAIL   Вверх
Anatoliy
Дата 9.9.2005, 23:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дело в том, что может быть не достаточно одного вызова send. Функция send возвращает кол-во переданных байт. Можно сделать, например, так

Код

int sendbytes;
int sendbytes_all = 0;
int n = количество байт, которые хотим отправить

do {
      sendbytes = send(...);
      sendbytes_all += sendbytes;
} while (sendbytes_all < n);

  Вверх
dmit10
Дата 10.9.2005, 13:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











int sendbytes;
int sendbytes_all = 0;
int n = количество байт, которые хотим отправить

do {
sendbytes = send(...);
sendbytes_all += sendbytes;
} while (sendbytes_all < n);

+Попробуй перед closesocket вызывать функцию shutdown.
  Вверх
RomkaRomka
Дата 12.9.2005, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!

Спасибо откликнувшимся.

Оно то понятно, что если за один раз все данные не отправились надо повторять отправку циклом. Только я описал немного другую ситуацию. У меня мои 40 кб вылетают из сокета за один прием, первый же вызов send возвращает число, равное размеру моего буфера. Но потом видать данные застряют в стеке протокола TCP за счет медленного клиента. Send вернул нормальное завершение, я закрываю сокет, а часть моих данных еще реально находится в транспортном буфере. Вот хотелось бы отловить момент когда эти данные уйдут оттуда. При том без всяких там подтверждений с другой стороны, а то это уже получится свой протокол.

С уважением, Роман.

PM MAIL   Вверх
Coocky
Дата 12.9.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(RomkaRomka @ 12.9.2005, 12:14)
Но потом видать данные застряют в стеке протокола TCP за счет медленного клиента

Это точно? Откуда такие данные?


Цитата(RomkaRomka @ 12.9.2005, 12:14)
При том без всяких там подтверждений с другой стороны

ИМХО без этого не обойтись..
smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Mad
Дата 12.9.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата(Coocky @ 12.9.2005, 11:19)
Цитата
При том без всяких там подтверждений с другой стороны

ИМХО без этого не обойтись..

как вариант, клиент может подтверждать окончание приема закрытием сокета со своей стороны

когда у тебя send() отработал, на сервере садиш сокет на recv(), когда клиент закроет сокет recv() вернет -1
а если наступит тайм-аут то вернет 0

Это сообщение отредактировал(а) Mad - 12.9.2005, 14:16


--------------------
user posted image
PM MAIL   Вверх
Coocky
Дата 12.9.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Mad @ 12.9.2005, 14:13)
когда у тебя send() отработал, на сервере садиш сокет на recv(), когда клиент закроет сокет recv() вернет -1
а если наступит тайм-аут то вернет 0

Дык
Цитата(Coocky @ 12.9.2005, 12:19)
ИМХО без этого не обойтись..
smile
А он просит

Цитата(RomkaRomka @ 12.9.2005, 12:14)
При том без всяких там подтверждений с другой стороны, а то это уже получится свой протокол.




--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
RomkaRomka
Дата 12.9.2005, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Coocky @ 12.9.2005, 12:19)
Цитата(RomkaRomka @ 12.9.2005, )
Но потом видать данные застряют в стеке протокола TCP за счет медленного клиента

Это точно? Откуда такие данные?


Простая логИкаsmile
Из моего приложения данные ушли (send вернул нормальное завершение), в приемник - пришли не все... В метровом шнурке врядли застрянут... Остается транспортный буфер драйвера tcpip.sys. Это я так думаю...

С уважением, Роман.

PM MAIL   Вверх
Coocky
Дата 12.9.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(RomkaRomka @ 12.9.2005, 16:33)
В метровом шнурке врядли застрянут... Остается транспортный буфер драйвера tcpip.sys. Это я так думаю...

На каком типе протокола работаешь?

Добавлено @ 16:46
Я имел ввиду TCP или UDP гнездо создаешь?


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
RomkaRomka
Дата 12.9.2005, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Coocky @ 12.9.2005, 16:39)

На каком типе протокола работаешь?

Добавлено @ 16:46
Я имел ввиду TCP или UDP гнездо создаешь?


TCP. Синхронные сокеты в блокирующем режиме. Впрочем пробовал и c асинхронными неблокирующими. WSASend возвращает 0, что говорит о успешном выполнении отправки. Закрываю сокет и на клиенте таже ситуация. Пришел не весь буфер.

С уважением, Роман.
PM MAIL   Вверх
Coocky
Дата 12.9.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Ну не знаю... smile
А неужели так принципиально
Цитата(Coocky @ 12.9.2005, 14:16)
При том без всяких там подтверждений с другой стороны, а то это уже получится свой протокол

smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
RomkaRomka
Дата 12.9.2005, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Coocky @ 12.9.2005, 17:38)
Ну не знаю... smile
А неужели так принципиально
Цитата(Coocky @ 12.9.2005, )
При том без всяких там подтверждений с другой стороны, а то это уже получится свой протокол

smile


Мне нужна простая обертка на сокеты, но работающая так как мне нужно. Да и разобраться хотелось бы, может таки есть выход.

С уважением, Роман.

PM MAIL   Вверх
Mayk
Дата 12.9.2005, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



Может поиграться с опциями сокета? Посмотреть в сторону SO_LINGER например. И смотреть в сторону EWOULDBLOCK в результате closesocket? smile


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 12.9.2005, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

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



О! Кажись нашел.
Цитата(http)

Note  To assure that all data is sent and received on a connection, an application should call shutdown before calling closesocket (see Graceful shutdown, linger options, and socket closure for more information). Also note, an FD_CLOSE network event is not posted after closesocket is called.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
RomkaRomka
Дата 13.9.2005, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Mayk @ 12.9.2005, 18:11)
О! Кажись нашел.
Цитата(http)

Note  To assure that all data is sent and received on a connection, an application should call shutdown before calling closesocket (see Graceful shutdown, linger options, and socket closure for more information). Also note, an FD_CLOSE network event is not posted after closesocket is called.


Ну, спасиба! Наверное это оно самое. Буду копать дальше.

С уважением, Роман.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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