2012-04-25 24 views
6

Tôi có một ứng dụng gửi điểm dữ liệu đến điểm từ người gửi đến người nhận qua một liên kết có thể hoạt động ở chế độ đơn (truyền một chiều) hoặc chế độ song công (hai chiều). Trong chế độ đơn giản, ứng dụng gửi dữ liệu bằng UDP và trong chế độ song công, nó sử dụng TCP. Vì việc ghi trên TCP socket có thể chặn, chúng tôi đang sử dụng Non Blocking IO (ioctl với FIONBIO - O_NONBLOCK và fcntl không được hỗ trợ trên phân phối này) và select() gọi hệ thống để xác định khi nào dữ liệu có thể được ghi. NIO được sử dụng để chúng tôi có thể hủy bỏ việc gửi sớm sau khi hết thời gian chờ nếu cần điều kiện mạng xấu đi. Tôi muốn sử dụng cùng một mã cơ bản để thực hiện việc gửi nhưng thay vào đó thay đổi giữa TCP/UDP ở mức trừu tượng cao hơn. Điều này làm việc tuyệt vời cho TCP.Bản ghi UDP không chặn có ít byte hơn yêu cầu không?

Tuy nhiên tôi lo ngại về cách không chặn IO hoạt động cho ổ cắm UDP. Tôi có thể đọc các trang người đàn ông không chính xác, nhưng kể từ khi write() có thể trả lại cho biết ít byte được gửi hơn yêu cầu, điều đó có nghĩa là một khách hàng sẽ nhận được ít byte hơn trong datagram của nó? Để gửi một bộ đệm dữ liệu nhất định, nhiều ghi có thể cần thiết, có thể là trường hợp kể từ khi tôi đang sử dụng không chặn IO. Tôi lo ngại rằng điều này sẽ chuyển thành nhiều gói dữ liệu UDP mà máy khách nhận được.

Tôi khá mới để lập trình socket nên hãy tha thứ cho tôi nếu có một số quan niệm sai lầm ở đây. Cảm ơn bạn.

+0

Bạn có thể muốn kiểm tra chi tiết cho bất kỳ hệ thống nào bạn đang làm việc cùng; ngăn xếp UDP của bạn có thể có các giới hạn cụ thể (thực sự, như bạn đã nêu). – geekosaur

Trả lời

2

Giả sử thực hiện UDP đúng (không bị hỏng), mỗi lần gửi/sendmsg/sendto sẽ tương ứng với chính xác toàn bộ gói dữ liệu được gửi và mỗi recv/recvmsg/recvfrom sẽ tương ứng với chính xác toàn bộ gói dữ liệu nhận được.

Nếu không thể truyền toàn bộ thư UDP, bạn sẽ nhận được lỗi EMSGSIZE. Một tin nhắn đã gửi có thể vẫn không thành công do kích thước tại một số thời điểm trong mạng, trong trường hợp đó, nó sẽ không đến. Nhưng nó sẽ không được phân phối thành từng phần (trừ khi ngăn xếp IP bị lỗi nghiêm trọng).

Nguyên tắc chung là giữ cho kích thước tải trọng UDP của bạn tối đa 1400 byte. Đó là rất gần đúng và để lại rất nhiều chỗ cho các dạng đường hầm khác nhau để tránh bị phân mảnh.

+0

Cảm ơn. Tôi đã làm một số thử nghiệm nhiều hơn và thấy rằng hoặc toàn bộ trọng tải của tôi hoặc không ai trong số nó được gửi cho một cuộc gọi viết() cho UDP - mà thực sự là điều duy nhất hợp lý đã xảy ra. Tôi đang trên VxWorks 5.5 với một nhà cung cấp được cung cấp ngăn xếp để hỗ trợ một TOE ... Tôi không ngạc nhiên khi tôi không thấy EMSGSIZE trên nền tảng đích. Dù sao, cảm ơn cho phản ứng có thẩm quyền, nó chắc chắn sẽ giúp cung cấp sự tự tin rằng tôi đã bao phủ các căn cứ. – aig7761

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