URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7406
[ Назад ]

Исходное сообщение
"как принять все данные из udp сокета"

Отправлено fa , 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

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


Содержание

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

Да

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

Имхо, нет

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

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


"как принять все данные из udp сокета"
Отправлено Аноним , 09-Июн-08 01:45 
>Имхо, нет

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


"как принять все данные из udp сокета"
Отправлено gdb , 10-Июн-08 01:50 

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