2011-01-25 37 views
5

Tôi gặp lỗi trong trường hợp sau đây với lệnh gọi IGMP;Lỗi ổ cắm: 90: Tin nhắn quá dài

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; 
} 

cuộc gọi gửi không gửi được thông báo quá dài. Tôi đang sử dụng 8192 làm kích thước bộ đệm. Vì vậy, tôi đã thử sử dụng cuộc gọi sau đây để khắc phục lỗi này;

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() gọi thành công nhưng lỗi tương tự cho sendto();

Vì vậy, tôi đã kiểm tra kích thước SO_SNDBUF bằng lệnh getockopt() và nó hiển thị 1 byte?!

Tôi đang làm gì sai.

Nhân Linux có cần biên dịch lại để hỗ trợ IGMP không? hoặc tôi đang thiếu cái gì đó?

Trả lời

7

Ethernet (lớp liên kết bạn có thể làm việc nhiều nhất chống lại) khung thường dài 1500 byte. Cung cấp cho các kích thước chính xác của tin nhắn, không phải kích thước bộ đệm là send().

SO_SNDBUF là bộ đệm trong mỗi bộ đệm, cho biết số lượng bộ đệm cho TCP, giới hạn kích thước của gói dữ liệu cho UDP và không có ý nghĩa gì đối với các ổ cắm thô.

+0

Cảm ơn Nik! để được giúp đỡ. Điều đó có nghĩa là đối với kịch bản này tôi nên sử dụng send() và không sendto() và kích thước tin nhắn chính xác (ngay cả khi kích thước mặc định là hơn 1500 ?!) và không phải kích thước buff. – Sathya

+0

HI, tôi đang cố gửi gói IGMP 'pigmp-> igmp_type = IGMP_MEMBERSHIP_QUERY;' và không phải là TCP hoặc UDP, tôi nghi ngờ chuỗi các cuộc gọi/những thứ tôi đang làm trong mã có thể sai hoặc các đối số/giá trị mà tôi đang sử dụng để điền các cấu trúc phải sai. Tôi đã kiểm tra và không thể tìm thấy một lỗi trong những khía cạnh đó. Vì vậy, bằng cách sử dụng send() thay vì sendto() không phải là hleping để sửa lỗi này. Bất cứ ai làm việc trên IGMP (Multicasting) có thể ném cho tôi một số ánh sáng. -Cảm ơn trước -Sathya – Sathya

+0

Hi Nik, Như đã nói, Bây giờ nó hoạt động tốt cho kích thước gói <= 1500. Nó ném erro: 90 cho bất cứ điều gì nhiều hơn (ngay cả đối với 1501). Tôi đã thử sử dụng setsockopt() để tăng SO_SNDBUF nhưng không có hiệu lực từ cuộc gọi đó. Vì lệnh send() không thể được sử dụng cho các bcos socket thô nên nó không kết nối và lý do tương tự cho gói IGMP tôi vẫn đang sử dụng sendto(). Tôi muốn biết những gì giữ tốt cho setsockopt() để SO_SNDBUF thay đổi. - Cảm ơn - Sathya – Sathya

Các vấn đề liên quan