2010-06-21 34 views
5

Trong một số trường hợp, tôi muốn loại bỏ một cách rõ ràng các gói đang chờ trên socket với chi phí thấp nhất có thể. Có vẻ như không có cuộc gọi hệ thống "thả udp đệm" rõ ràng, nhưng có thể tôi đã sai?Hủy gói UDP đến mà không cần đọc

Cách tốt nhất tiếp theo có thể là recv gói đến bộ đệm tạm thời và chỉ cần thả nó. Có vẻ như tôi không thể nhận được 0 byte, kể từ khi người đàn ông nói về recv: The return value will be 0 when the peer has performed an orderly shutdown. Vì vậy, 1 là tối thiểu trong trường hợp này.

Có cách nào khác để xử lý việc này không?

Chỉ trong trường hợp - đây không phải là tối ưu hóa sớm. Điều duy nhất máy chủ này đang làm là chuyển tiếp/gửi các gói UDP theo cách cụ thể - mặc dù recv với len=1 sẽ không giết tôi, tôi chỉ muốn loại bỏ toàn bộ hàng đợi trong một lần với một số chức năng cụ thể hơn (hy vọng hạ thấp độ trễ).

+0

Bạn đang sử dụng tiêu chí nào để quyết định loại bỏ gì? –

+0

Không chắc chắn những gì tôi có thể nói ở đây vì vậy nó có ý nghĩa ... về cơ bản hai bên đang công bố (với một số cookie chia sẻ) rằng họ cần một proxy. Máy chủ phải mở ổ cắm sau yêu cầu đầu tiên để đảm bảo rằng cổng không được sử dụng bởi bất kỳ ai khác. Cho đến khi thiết lập hoàn tất, tôi cần phải thả các gói dữ liệu, nếu không chúng sẽ được xếp hàng và gửi lại sau đó - đó là một điều rất xấu trong kịch bản của tôi. Vì vậy, về cơ bản tôi đã có một lá cờ nội bộ cho mỗi kết nối mà nói - thả tất cả mọi thứ, hoặc chuyển tiếp tất cả mọi thứ. – viraptor

Trả lời

8

Bạn có kernel loại bỏ gói tin UDP bằng cách thiết lập các UDP nhận đệm 0.

int UdpBufSize = 0; 
socklen_t optlen = sizeof(UdpBufSize); 
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &UdpBufSize, optlen); 

Bất cứ khi nào bạn thấy phù hợp để nhận gói tin, sau đó bạn có thể thiết lập bộ đệm, ví dụ, 4096 byte .

+1

Đó là '& UdpBufSize', phải không? ;) – viraptor

+0

Cảm ơn bạn đã nắm bắt! :) – WindsurferOak

+0

Có cách nào để loại bỏ các gói có chọn lọc từ một 'sockkaddr' w/o cụ thể có phải' recv' vào một bộ đệm tạm thời và sau đó thả bộ đệm? –

3

Tôi chỉ muốn loại bỏ toàn bộ hàng đợi trong một đi

Vì đây là UDP chúng ta đang nói ở đây: close(udp_server_socket) và ổ cắm()/bind() một lần nữa?

Để hiểu biết của tôi sẽ hoạt động.

+0

Đó là một giải pháp thú vị ... không may là nó sẽ không hoạt động đối với phạm vi đặc quyền sau khi một gốc bị rơi (nếu socket bị ràng buộc trước đó). Tôi sẽ thử mặc dù. – viraptor

+0

Ah - và nó sẽ gây ra lỗi được trả lại cho khách hàng - mà tôi không thể chấp nhận không may ... – viraptor

+0

@viraptor: "nó sẽ gây ra lỗi được trả lại cho khách hàng" - chỉ khi khách hàng chạy cục bộ. Và khách hàng nên bỏ qua lỗi từ UDP anyway (bên cạnh có thể chạm vào một bộ đếm lỗi) vì kiểu giao tiếp không đáng tin cậy. Nếu không, cá nhân tôi thấy không có vấn đề chỉ đơn giản là đọc ra tất cả các tin nhắn: UDP recv đệm theo mặc định là đủ nhỏ và thậm chí nếu bạn bump nó đến vài megs, nó vẫn đậu phộng cho CPU hiện đại. – Dummy00001

1

người đàn ông nói về recv: giá trị trả về sẽ là 0 khi người ngang hàng đã thực hiện tắt máy theo thứ tự.

Điều đó không áp dụng cho UDP. Không có "kết nối" để tắt trong UDP. Giá trị trả về của 0 là hoàn toàn hợp lệ, nó chỉ có nghĩa là datagram không nhận được tải trọng (tức là chỉ IP và UDP.)

Không chắc chắn có giúp được vấn đề của bạn hay không. Tôi thực sự không hiểu bạn đang đi đâu với len = 1 thứ.

+0

Không hoàn toàn đúng sự thật. Bạn có thể gọi kết nối trên một ổ cắm UDP mà sẽ làm cho nó từ chối các gói tin từ bất kỳ máy chủ nào khác: kết hợp cổng và sẽ cho phép gửi các lỗi mạng ICMP tới socket. –

+0

Kết nối! = Kết nối. Không có bắt tay, không xé rách, không có thứ tự các gói dữ liệu, hoặc bất cứ thứ gì mà hầu hết mọi người thường kết hợp với một kết nối. Để tâm trí của tôi kết nối là một sự nhầm lẫn với UDP và dẫn đến sự nhầm lẫn. – Duck

+0

Tôi sẽ không đồng ý và nói rằng nó giống như một kết nối như là 'TCP'. Hãy nhớ rằng ngay cả trong 'TCP', mỗi đầu duy trì trạng thái độc lập của riêng nó và nếu một đầu kết thúc, lỗi kia sẽ không bao giờ biết về nó cho đến khi chúng thực hiện hai lần gửi và nhận được lỗi đường ống bị hỏng. Khái niệm "kết nối" trong tâm trí của tôi liên quan đến vấn đề liệu bạn đang nói chuyện nhiều-một-một hoặc một-một trong một cách được thực thi. Tất nhiên có các đối số để xem nó theo một trong hai cách :-) –

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