| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Отправка данных через сокет |
| Автор: RomkaRomka 9.9.2005, 14:49 |
| Добрый день! Столкнулся с такой проблемой: синхронный сокет в блокирующем режиме, соединение установлено. Отправляю данные (send) - возвращается число байт, которое я посылал. Получается данные отправлены. За ненадобностью следом закрываю сокет (closesocket). Смотрю принимающую сторону - пришло не все. Убираю closesocket - приходит все. В МСДН грится - The successful completion of a send does not indicate that the data was successfully delivered. Вопрос в том, как можно отследить что данные РЕАЛЬНО ушли? Заранее благодарен С уважением, Роман |
| Автор: Anatoliy 9.9.2005, 23:04 | ||
Дело в том, что может быть не достаточно одного вызова send. Функция send возвращает кол-во переданных байт. Можно сделать, например, так
|
| Автор: dmit10 10.9.2005, 13:28 |
| 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 |
| Добрый день! Спасибо откликнувшимся. Оно то понятно, что если за один раз все данные не отправились надо повторять отправку циклом. Только я описал немного другую ситуацию. У меня мои 40 кб вылетают из сокета за один прием, первый же вызов send возвращает число, равное размеру моего буфера. Но потом видать данные застряют в стеке протокола TCP за счет медленного клиента. Send вернул нормальное завершение, я закрываю сокет, а часть моих данных еще реально находится в транспортном буфере. Вот хотелось бы отловить момент когда эти данные уйдут оттуда. При том без всяких там подтверждений с другой стороны, а то это уже получится свой протокол. С уважением, Роман. |
| Автор: Coocky 12.9.2005, 12:19 | ||||
Это точно? Откуда такие данные?
ИМХО без этого не обойтись.. |
| Автор: Mad 12.9.2005, 14:13 | ||||
как вариант, клиент может подтверждать окончание приема закрытием сокета со своей стороны когда у тебя send() отработал, на сервере садиш сокет на recv(), когда клиент закроет сокет recv() вернет -1 а если наступит тайм-аут то вернет 0 |
| Автор: Coocky 12.9.2005, 14:16 | ||||||
Дык
А он просит
|
| Автор: RomkaRomka 12.9.2005, 16:33 | ||||
Простая логИка Из моего приложения данные ушли (send вернул нормальное завершение), в приемник - пришли не все... В метровом шнурке врядли застрянут... Остается транспортный буфер драйвера tcpip.sys. Это я так думаю... С уважением, Роман. |
| Автор: Coocky 12.9.2005, 16:39 | ||
На каком типе протокола работаешь? Добавлено @ 16:46 Я имел ввиду TCP или UDP гнездо создаешь? |
| Автор: RomkaRomka 12.9.2005, 17:33 | ||
TCP. Синхронные сокеты в блокирующем режиме. Впрочем пробовал и c асинхронными неблокирующими. WSASend возвращает 0, что говорит о успешном выполнении отправки. Закрываю сокет и на клиенте таже ситуация. Пришел не весь буфер. С уважением, Роман. |
| Автор: Coocky 12.9.2005, 17:38 | ||
| Ну не знаю... А неужели так принципиально
|
| Автор: RomkaRomka 12.9.2005, 17:50 | ||||
Мне нужна простая обертка на сокеты, но работающая так как мне нужно. Да и разобраться хотелось бы, может таки есть выход. С уважением, Роман. |
| Автор: Mayk 12.9.2005, 17:53 |
| Может поиграться с опциями сокета? Посмотреть в сторону SO_LINGER например. И смотреть в сторону EWOULDBLOCK в результате closesocket? |
| Автор: Mayk 12.9.2005, 18:11 | ||
О! Кажись нашел.
|
| Автор: RomkaRomka 13.9.2005, 11:28 | ||||
Ну, спасиба! Наверное это оно самое. Буду копать дальше. С уважением, Роман. |
| Автор: MAX2002 26.11.2005, 13:10 |
| Все очень просто |
| Автор: Гость_En_t_end 27.11.2005, 14:34 |
| RomkaRomka Тут рядом в этой ветке тема лежала про концепцию класса-враппера под сокеты, там мне люди очень сильно помогли, думаю их опыт и довольно рациональные решения будут тебе кстати... |
| Автор: oleg200095 25.3.2010, 13:37 |
| Один дурацкий вопрос. Как с помощью write отправить через сокет что нибудь кроме строки например число? |
| Автор: SVN74 17.4.2010, 14:25 | ||
int A = 5; write( (char*)&A ) |