2011-12-16 13 views
7

Đây là kết quả từ chương trình của tôiTôi đang gửi gói UDP từ localhost đến localhost và chạy trên các gói đôi khi thả. Làm thế nào để tôi ngừng điều này và tại sao nó lại xảy ra?

sending agent update 
Created new player 
Identified 
sending agent update 
Physics: 2 ticks this frame 
time= 200 
time= 300 
***Packet Dropped: 2:10 *** 
***Packet Dropped: 2:11 *** 
***Packet Dropped: 2:12 *** 
***Packet Dropped: 2:13 *** 
***Packet Dropped: 2:14 *** 
***Packet Dropped: 2:15 *** 
***Packet Dropped: 2:16 *** 
***Packet Dropped: 2:17 *** 
***Packet Dropped: 2:18 *** 
***Packet Dropped: 2:19 *** 
***Packet Dropped: 2:20 *** 
***Packet Dropped: 2:21 *** 
time= 400 
Physics: 2 ticks this frame 
time= 500 
Physics: 2 ticks this frame 

gửi các gói tin từ máy chủ địa phương đến máy chủ địa phương, các gói tin được thả. Điều này chỉ xảy ra gần đầu. 10 gói dữ liệu đầu tiên có được thông qua, sau đó các gói sau khi thả. 5 đến 40 gói liên tiếp. Sau đó, các gói dừng lại.

Có lý do nào để điều này xảy ra không?

Cập nhật:

Các mã sau đây khắc phục vấn đề.

int buffsize = 65536; // 65536 
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (void*)&buffsize, sizeof(buffsize)); 

Tôi đã gửi gói quá nhanh và vượt quá bộ đệm nhận mặc định của cửa sổ, chỉ 8 KB. Việc tăng kích thước bộ đệm đã khắc phục được sự cố.

+0

Khó nói mà không thấy mã. Quá nhiều ẩn số. –

Trả lời

8

Kiểm tra kích thước bộ đệm UDP được định cấu hình theo mặc định trong hệ điều hành của bạn.

Nếu bạn tìm thấy nó ít hơn, bạn có thể cung cấp rõ ràng giá trị lớn hơn trong khi tạo ổ cắm UDP.

 
int buffer_size = 4 * 1024 * 1024 ; 
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size)); 

Bạn có thể thấy liên kết THIS khá hữu ích.

+0

Tôi đã đưa ra giải pháp này trước khi đọc câu trả lời của bạn, nhưng bạn hoàn toàn chính xác. Điều này giải quyết được vấn đề của tôi. – HaltingState

+0

Gần đây tôi đã có một vấn đề tương tự và tôi chạy vào một giới hạn cứng cho các kích thước bộ đệm nhận/gửi tối đa. Việc tăng giá trị lên một số giá trị cao đã giải quyết được vấn đề: 'sysctl -w net.core.rmem_max = $ [2 * 1024 * 1024]' và 'sysctl -w net.core.wmem_max = $ [2 * 1024 * 1024]'. Vui đủ 'setsockopt' đã làm * không * trả về lỗi và dường như chỉ bỏ qua các giá trị lớn hơn mức tối đa này. – hochl

+0

@hochl Tôi đồng ý, nó có thể hơi bực bội (phải đối mặt với nó một mình :)) – Arunmu

1

Như một dự đoán thực sự nhanh chóng - trong quá khứ tôi đã thấy điều này vì cửa sổ nhận được đầy. Về cơ bản, ứng dụng của bạn không tiêu thụ các gói đủ nhanh và hạt nhân chỉ có nhiều không gian dành riêng - bạn cần tăng tham số rwin. Hoặc ở phía bên kia bạn đang gửi chúng quá nhanh - các tham số trên hộp Linux là

net.ipv4.udp_rmem_min = 4096 
net.ipv4.udp_wmem_min = 4096 
4

Có thể bạn đang gửi gói quá nhanh và do đó tràn bộ đệm. Bạn cần phải thực hiện tốc độ truyền để đảm bảo máy phát không áp đảo máy thu. Bạn sẽ không bao giờ 100% tránh điều này - đó là bản chất của UDP mà nó không cung cấp một đảm bảo giao hàng.

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