Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Winsock  (Прочитано 15193 раз)
0 Пользователей и 1 Гость смотрят эту тему.
xoms
Гость
« : 23-09-2004 10:06 » 

Оператором WSASend отправляю в сеть например 5000 байт. Оператором WSARecv на другом конце принимается море пакетов разной величины.
Вопрос, как сделать так чтобы принимался только один пакет с 5000 байтами (сколько пакетов отправили, чтоб столько и принять).
Записан
Серж
Гость
« Ответ #1 : 23-09-2004 10:13 » 

xoms, надо принимать, сколько приходит, и считать, пока будет 5000.
Записан
xoms
Гость
« Ответ #2 : 23-09-2004 11:15 » 

Цитата: Серж
xoms, надо принимать, сколько приходит, и считать, пока будет 5000.


Неет. Хочу чтобы, Winsock это всё делал за меня.
Записан
Серж
Гость
« Ответ #3 : 23-09-2004 11:59 » 

xoms, хорошо бы, чтобы Билл Гейтс за нас программировал. Улыбаюсь
Записан
xoms
Гость
« Ответ #4 : 23-09-2004 12:57 » 

Цитата: Серж
xoms, хорошо бы, чтобы Билл Гейтс за нас программировал. Улыбаюсь


Вообще-то где-то я читал, что есть в Winsock такая возможность.
Надо то ли при создании сокета вместо NULL как-то заполнить структуру (не помню как называется, передается в wsasocket), то ли в wsasend в dwFlags что-то записать, толи в wsarecv .... но что-то было.
Записан
Серж
Гость
« Ответ #5 : 23-09-2004 13:24 » 

xoms, узнаешь - сообщи.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 24-09-2004 16:51 » 

xoms, через ethernet такой пакет не пройдет - обычно не более 1500 байт. В твоем случае происходит фрагментация большого пакета, или посылка серии более мелких.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xoms
Гость
« Ответ #7 : 26-09-2004 03:50 » 

Про дефрагментацию я знаю. Надо Winsock заставить работать как мне надо.
Записан
darkelf
Молодой специалист

ro
Offline Offline

« Ответ #8 : 27-09-2004 06:26 » 

в Unix-ах есть у recv()-а флаг WAIT_ALL, который, в принципе, для этого предназначен. Так-же в некоторых Unix-ах есть lowwatermark/highwatermark, которые задают уровни срабатывания для select()-а. В Windows, как я понял, эти опции есть (SIOCLOWAT/SIOCHIWAT), но в MSDN-е я про них ничего не нашел.
Записан
xoms
Гость
« Ответ #9 : 29-09-2004 06:42 » 

Пойду пробовать.

Кстати тогда тот же вопрос в обратную сторону.
Посылаю wsasendом маленькие пакеты от 10 до 300 байт. Наблюдаю сниффером один большой в сети (от 1400 до 1460 байт) в котором эти все маленькие и упакованы. Как сделать так чтобы по сети они передавались такими как отправил? Иммется ввиду поле данных  в IP датаграмме.
Записан
darkelf
Молодой специалист

ro
Offline Offline

« Ответ #10 : 29-09-2004 12:54 » 

Для этого надо отключать алгоритм Нейгла, TCP_NODELAY через:
Код:

int fl = 1;
setsockopt)sock, IPPROTO_TCP, TCP_NODELAY, &fl, sizeof)fl::;
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #11 : 29-09-2004 14:19 » 

darkelf, ты прав именно это и надо сделать, НО надо хорошо понимать ЧТО ты делаешь!!! ибо то, что как тебе кажется хорошо работает в тестовом режиме (на локальной машине, в локальной сети и т.д.), не обязательно будет хорошо (а может и вообще не будет) работать в рабочей сети... а потому, ооочень рекомендую сначала прочитать зачем вообще нужен алгоритм Нейгла Ага

Кстати TCP протокол потоковый ... и никаких пакетов там нет! что на практике хорошо видно ...
Цитата

отправляю в сеть например 5000 байт.....а на другом конце принимается море пакетов разной величины.

нужно всегда уточнять, что ты подразумеваешь под словом пакет...

По поводу собственно вопроса  (что  типа из сети приходит поток, а для работы нужно сообщение полностью) я бы всеже делал как и все (большинство) т.е. точно так как сказал Серж
Цитата

надо принимать, сколько приходит, и считать, пока будет 5000.
Записан

С уважением Lapulya
xoms
Гость
« Ответ #12 : 01-10-2004 05:35 » 

Большое спасибо darkelf. Действительно работает и сильно помогает.

Теперь на замечание Lapulya. Если речь идёт о винсоке ,то естественно пакеты это те которые приходят от WSARecv. Но всё равно спасибо за помощь.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 04-10-2004 12:27 » 

xoms, пользуйся UDP

В одном пакете UDP можно передать до 64К данных, причём одному send будет соответствовать ровно один пакет UDP.  IP уровень его для тебя разобъёт на кусочки, потом соберёт и доставит в сокет получателя ровно столько данных, сколько было отправлено.

Правда, у UDP есть масса недостатков по сравнению с TCP, так что выбирай сам.

TCP тоже, потенциально, может высылать данные большого размера в одном сообщении TCP, но это считается дурным тоном у разработчиков, так как на уровень IP накладывается дополнительная нагрузка по фрагментированию/ дефрагментации большого пакета IP.  Я предполагаю, что разрабочики TCP/IP для Windows тоже придерживаются правила делать TCP сегменты такого размера, чтобы IP пакет мог дойти до получателя без фрагментирования.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines