![]() |
|
Модераторы: feodorv |
![]()
|
|
| RomkaRomka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.9.2005 Где: Луганск Репутация: нет Всего: 1 |
Добрый день!
Столкнулся с такой проблемой: синхронный сокет в блокирующем режиме, соединение установлено. Отправляю данные (send) - возвращается число байт, которое я посылал. Получается данные отправлены. За ненадобностью следом закрываю сокет (closesocket). Смотрю принимающую сторону - пришло не все. Убираю closesocket - приходит все. В МСДН грится - The successful completion of a send does not indicate that the data was successfully delivered. Вопрос в том, как можно отследить что данные РЕАЛЬНО ушли? Заранее благодарен С уважением, Роман |
|||
|
||||
| Anatoliy |
|
|||
|
Unregistered |
Дело в том, что может быть не достаточно одного вызова send. Функция send возвращает кол-во переданных байт. Можно сделать, например, так
|
|||
|
||||
| dmit10 |
|
|||
|
Unregistered |
int sendbytes;
int sendbytes_all = 0; int n = количество байт, которые хотим отправить do { sendbytes = send(...); sendbytes_all += sendbytes; } while (sendbytes_all < n); +Попробуй перед closesocket вызывать функцию shutdown. |
|||
|
||||
| RomkaRomka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.9.2005 Где: Луганск Репутация: нет Всего: 1 |
Добрый день!
Спасибо откликнувшимся. Оно то понятно, что если за один раз все данные не отправились надо повторять отправку циклом. Только я описал немного другую ситуацию. У меня мои 40 кб вылетают из сокета за один прием, первый же вызов send возвращает число, равное размеру моего буфера. Но потом видать данные застряют в стеке протокола TCP за счет медленного клиента. Send вернул нормальное завершение, я закрываю сокет, а часть моих данных еще реально находится в транспортном буфере. Вот хотелось бы отловить момент когда эти данные уйдут оттуда. При том без всяких там подтверждений с другой стороны, а то это уже получится свой протокол. С уважением, Роман. |
|||
|
||||
| Coocky |
|
||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Это точно? Откуда такие данные?
ИМХО без этого не обойтись.. -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
||||
|
|||||
| Mad |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 3 Всего: 19 |
как вариант, клиент может подтверждать окончание приема закрытием сокета со своей стороны когда у тебя send() отработал, на сервере садиш сокет на recv(), когда клиент закроет сокет recv() вернет -1 а если наступит тайм-аут то вернет 0 Это сообщение отредактировал(а) Mad - 12.9.2005, 14:16 |
||||
|
|||||
| Coocky |
|
||||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Дык
А он просит
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
||||||
|
|||||||
| RomkaRomka |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.9.2005 Где: Луганск Репутация: нет Всего: 1 |
Простая логИка Из моего приложения данные ушли (send вернул нормальное завершение), в приемник - пришли не все... В метровом шнурке врядли застрянут... Остается транспортный буфер драйвера tcpip.sys. Это я так думаю... С уважением, Роман. |
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
На каком типе протокола работаешь? Добавлено @ 16:46 Я имел ввиду TCP или UDP гнездо создаешь? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| RomkaRomka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.9.2005 Где: Луганск Репутация: нет Всего: 1 |
TCP. Синхронные сокеты в блокирующем режиме. Впрочем пробовал и c асинхронными неблокирующими. WSASend возвращает 0, что говорит о успешном выполнении отправки. Закрываю сокет и на клиенте таже ситуация. Пришел не весь буфер. С уважением, Роман. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: нет Всего: 62 |
Ну не знаю...
А неужели так принципиально
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| RomkaRomka |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.9.2005 Где: Луганск Репутация: нет Всего: 1 |
Мне нужна простая обертка на сокеты, но работающая так как мне нужно. Да и разобраться хотелось бы, может таки есть выход. С уважением, Роман. |
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
Может поиграться с опциями сокета? Посмотреть в сторону SO_LINGER например. И смотреть в сторону EWOULDBLOCK в результате closesocket?
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
О! Кажись нашел.
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| RomkaRomka |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 9.9.2005 Где: Луганск Репутация: нет Всего: 1 |
Ну, спасиба! Наверное это оно самое. Буду копать дальше. С уважением, Роман. |
||||
|
|||||
| MAX2002 |
|
|||
|
Unregistered |
Все очень просто
|
|||
|
||||
| Гость_En_t_end |
|
|||
|
Unregistered |
RomkaRomka
Тут рядом в этой ветке тема лежала про концепцию класса-враппера под сокеты, там мне люди очень сильно помогли, думаю их опыт и довольно рациональные решения будут тебе кстати... |
|||
|
||||
| oleg200095 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 3.6.2009 Репутация: нет Всего: нет |
Один дурацкий вопрос.
Как с помощью write отправить через сокет что нибудь кроме строки например число? |
|||
|
||||
| SVN74 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 5.5.2008 Где: Комсомольск на Дн епре Репутация: 1 Всего: 18 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |