2012-04-08 28 views
6

Tôi đang tạo một chương trình tạo ổ cắm RAW để đọc tất cả lưu lượng truy cập. Giữa cuộc gọi của socket() và recvfrom() (cuối cùng là trong một vòng lặp để lấy ra tất cả các gói từ bộ đệm) tôi chờ 5s.Tại sao thay đổi giá trị của SO_RCVBUF không hoạt động?

Khi tôi chạy chương trình, tôi gửi khoảng 200 gói có lệnh hping3 trong «chế độ nhanh hơn» (để điền nhanh bộ đệm) vào chương trình của tôi. Ngay sau khi 5s được trôi qua, chương trình của tôi trích xuất khoảng 150 gói từ bộ đệm.

Tôi cố gắng để thay đổi kích thước của bộ đệm nhận để có được kết quả tốt hơn:

int a = 65535; 
if ((setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int))) < 0) 
{ 
    fprintf(stderr, "Error setting sock opts..\n"); 
} 

Tuy nhiên, bất cứ điều gì là giá trị của «một», 1 hoặc 10000000, có vẻ như không có gì thay đổi, tôi vẫn nhận được ~ 150 gói từ bộ đệm.

Sự cố là gì?

Chỉnh sửa: Giá trị của «a» được xác minh bằng cuộc gọi getsockopt.

+0

Bạn có thể hiển thị thêm mã cho chúng tôi, bao gồm cả các lệnh gọi có liên quan đến 'socket()' vv không? Cho chúng tôi biết hệ điều hành của bạn cũng có thể giúp bạn. –

+0

Chắc chắn, tôi chạy chương trình này dưới Linux 3.2 64bits. Cuộc gọi đến 'socket()': 'sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_TCP)' – Flow

Trả lời

7

Các level lập luận để setsockopt nên SOL_SOCKET, không 0:

int a = 65535; 
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) { 
    fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno)); 
} 
+0

Cảm ơn bạn, nó hoạt động tốt những thay đổi giá trị ngay bây giờ. Tuy nhiên giới hạn của bộ đệm nhận là 262142 và nếu một gói có kích thước 50 byte thì có nên có khoảng 5200 gói trong bộ nhớ và không chỉ 150? – Flow

+0

(đã giải quyết, xem bên dưới) – Flow

13

Bạn cũng có thể bị giới hạn bởi hệ điều hành, nếu nó vẫn dường như không có tác dụng. Kiểm tra các giá trị trong:

/proc/sys/net/core/rmem_default 
/proc/sys/net/core/rmem_max 

Nếu đó là TCP như bạn nói trong ví dụ của bạn, và không thực sự là một socket thô, bạn cũng có thể kiểm tra các giá trị trong:

/proc/sys/net/ipv4/tcp_mem 

Nếu bạn chạy mèo bằng các các tệp sẽ hiển thị cho bạn cài đặt hiện tại. Để thay đổi chúng vĩnh viễn, hãy sử dụng sysctl. Bạn nên viết các cài đặt này trước khi bắt đầu thay đổi mọi thứ. Dưới đây là hướng dẫn tuyệt vời về cách thực hiện những thay đổi đó: http://fasterdata.es.net/fasterdata/host-tuning/linux/.

+0

Cảm ơn bạn, tôi đã tăng giá trị rmem_max và nó hoạt động rất tốt Tôi có thể nhận tất cả các gói. – Flow

+0

Bạn có bất kỳ ý tưởng nào về cửa sổ, nơi chúng tôi có thể kiểm tra các giá trị này không? – sreepurna

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