Ошибка сокета: 90: сообщение слишком длинное - PullRequest
5 голосов
/ 25 января 2011

У меня ошибка из следующего сценария с вызовом сокета IGMP;

fd = socket(PF_INET,  SOCK_RAW, IPPROTO_IGMP) ;
setsockopt( fd, IPPROTO_IP, IP_HDRINCL, nval, sizeof(nval) );
/** Fill in the IP header and Ethernet header**/
/*** Fill, create the IGMP packet structures***/
if(sendto( fd, &buf, sizeof(buf), 0,(struct sockaddr *) &addr, sizeof(addr)) < 0) {
    printf("Socket Sendto error %d : %s\n", errno, strerror(errno));
    return 0;
}

вызов sendto не может сказать слишком длинное сообщение. Я использую 8192 в качестве размера буфера. Поэтому я попытался использовать следующий вызов, чтобы исправить эту ошибку:

if(setsockopt(dlpifd, IPPROTO_IP, SO_SNDBUF, &val, sizeof(int)) < 0) {
   printf("Can't set socket options:%d:%s\n", errno, strerror(errno));
   return 0;`
}

вызов setsockopt () выполнен успешно, но такая же ошибка для sendto ();

Итак, я проверил размер SO_SNDBUF с помощью вызова getsockopt (), и он показывает 1 байт?!

Что я не так делаю.

Нужно ли ядру Linux перекомпилировать для поддержки IGMP? или я что-то упустил?

1 Ответ

7 голосов
/ 25 января 2011

Ethernet (канальный уровень, с которым вы, скорее всего, работаете) кадр обычно имеет длину 1500 байт.Укажите send() точный размер сообщения, а не размер буфера.

SO_SNDBUF - это встроенный в ядро ​​буфер на сокет, который сообщает, сколько буфера для TCP, ограничивает размер дейтаграммыдля UDP и не имеет никакого смысла для необработанных сокетов.

...