Всем привет.
Пытаюсь разобраться с сокетами. Не пойму, что происходит с данными, которые при считывании из сокета не влезли в буффер. Они просто отбрасываются? Можно ли прочитать содержимое сокета за несколько заходов? Если нет, каким выставлять размер буффера, чтоб уж наверняка влезло все за одно считывание.Вот собственно код:
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 поле длины 16битное, соответственно 64KB хватит всем (С).
>Имхо, нетХотя может и да. По крайней мере точно можно вызывать recv с MSG_PEEK и увеличивать буффер если сообщение не влезло, но с логикой работы datagram протокола это никак не стыкуется.
сделайте буффер 65536
и читайте весь 65536 размер
если данных будет меньше то вам это возратит recvfrom
больше никогда не будет
это размер UDP