The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"как принять все данные из udp сокета"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"как принять все данные из udp сокета"  
Сообщение от fa email(??) on 08-Июн-08, 04:09 
Всем привет.
Пытаюсь разобраться с сокетами. Не пойму, что происходит с данными, которые при считывании из сокета не влезли в буффер. Они просто отбрасываются? Можно ли прочитать содержимое сокета за несколько заходов? Если нет, каким выставлять размер буффера, чтоб уж наверняка влезло все за одно считывание.

Вот собственно код:
while(1) {
    memset(msg,0x0,MAX_MSG);
    cliLen = sizeof(cliAddr);
    n = recvfrom(sd,msg,MAX_MSG,0,(struct sockaddr *) &cliAddr,&cliLen);
    if(n<0) {
      printf("%s: cannot receive data \n",argv[0]); continue;
    }
    printf("%s: from %s:UDP%u : %s \n", argv[0],inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port),msg);
}
Netcat-ом шлю этому серверу строку символов. Если она больше MAX_MSG, лишние данные просто отбрасываются.Можно ли их получить не увеличивая MAX_MSG

Заранее спасибо

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "как принять все данные из udp сокета"  
Сообщение от Аноним (??) on 08-Июн-08, 23:34 
>Пытаюсь разобраться с сокетами. Не пойму, что происходит с данными, которые при
>считывании из сокета не влезли в буффер. Они просто отбрасываются?

Да

>Можно ли прочитать содержимое сокета за несколько заходов? Если нет, каким выставлять

Имхо, нет

>размер буффера, чтоб уж наверняка влезло все за одно считывание.

Таким, какой максимальный размер может быть отправлен передающей стороной.
Если размер неизвестен, логичнее использовать все-таки потоковый протокол.
Как полумера - взять максимальный размер пакета. У UDP поле длины 16битное, соответственно 64KB хватит всем (С).

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "как принять все данные из udp сокета"  
Сообщение от Аноним (??) on 09-Июн-08, 01:45 
>Имхо, нет

Хотя может и да. По крайней мере точно можно вызывать recv с MSG_PEEK и увеличивать буффер если сообщение не влезло, но с логикой работы datagram протокола это никак не стыкуется.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "как принять все данные из udp сокета"  
Сообщение от gdb on 10-Июн-08, 01:50 

сделайте буффер 65536
и читайте весь 65536 размер
если данных будет меньше то вам это возратит recvfrom
больше никогда не будет
это размер UDP
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру