2012-09-20 25 views
12

Tôi chỉ đang dọn dẹp một số mã mà chúng tôi đã viết một lúc và nhận thấy rằng đối với một ổ cắm udp, 0 đang được coi là kết nối đã đóng.Trong Linux, có thể recv bao giờ trở về 0 trên UDP?

Tôi khá chắc chắn đây là kết quả của việc chuyển cùng một vòng lặp recv từ phiên bản tcp tương đương. Nhưng nó làm tôi ngạc nhiên. Có thể recv trả về 0 cho udp không? trên tcp nó báo hiệu đầu kia đã đóng kết nối. udp không có khái niệm về kết nối sao cho nó có thể trả về 0? và nếu nó có thể, ý nghĩa của nó là gì?

Lưu ý: trang người dùng trong linux không phân biệt udp và tcp cho mã trả về bằng 0 có thể là lý do chúng tôi giữ séc trong mã.

+0

Ổ cắm UDP có được kết nối hay không? –

+0

Bạn có thể gọi "kết nối" trên ổ cắm UDP, nhưng tất cả những gì có là gán một địa chỉ IP/cổng từ xa vào ổ cắm UDP. Điều đó cho phép bạn gọi chỉ là "gửi" và "recv" mà không cần sendto, recvfrom. Tôi tin rằng nó cũng hoạt động như một bộ lọc và chỉ cho phép bạn nhận các gói dữ liệu udp chỉ từ địa chỉ đó. Vì vậy, theo nghĩa nào đó chúng được kết nối, nhưng không giống với TCP. – Matt

Trả lời

12

udp không có khái niệm về kết nối sao cho nó có thể trả về 0? và nếu có thể, ý nghĩa của nó là gì

Nó có nghĩa là một datagram 0 chiều dài đã được nhận. Từ tuyệt vời UNP:

Viết một datagram có chiều dài 0 là chấp nhận được. Trong trường hợp của UDP, kết quả này trong một kết quả IP có chứa một tiêu đề IP (thường là 20 byte cho IPv4 và 40 byte cho IPv6), một tiêu đề UDP 8 byte và không có dữ liệu. Điều này cũng có nghĩa là giá trị trả về 0 từ recvfrom là chấp nhận được cho giao thức datagram: Điều đó không có nghĩa là số ngang hàng đã đóng kết nối , cũng như giá trị trả về 0 từ đọc trên ổ cắm TCP. Vì UDP không kết nối được nên không có kết nối UDP .

+0

Không thể nhớ là một gói dữ liệu đảm bảo được phân phối hoặc không giống như tcp nơi bạn có thể nhận được một số dữ liệu. –

+0

@AdrianCornish Tôi nghĩ rằng tất cả các ngăn xếp hiện đại cố gắng phân phối nó ngay cả khi không có tải trọng. – cnicutar

+0

Phrased câu hỏi đó nặng - ví dụ tôi có thể gửi 100 byte trên một kết nối TCP và đầu kia chỉ có thể nhận được 50 và cần phải đọc lại - vì vậy tôi cho rằng câu hỏi thực sự có thể là một datagram được phân mảnh tại lớp ứng dụng –

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