Tôi có một vấn đề rất khó chịu mà tôi tìm thấy nhiều lần trên các diễn đàn khác nhưng tôi không thể tìm thấy một giải pháp thích hợp. Vấn đề là recv() trả về 0 trên vài byte cuối cùng của kết nối. Dưới đây là một số thông tin cơ bản.recv() trả về 0
- Cả hai ứng dụng (máy khách/máy chủ) đều chạy trên cùng một máy.
- Cả hai ổ cắm (máy khách/máy chủ) đều không chặn
- Kích thước dữ liệu được truyền là 53 byte.
- Cả hai (máy khách/máy chủ) gọi tắt máy và đóng sổ khi gửi lệnh gửi()/recv() cuối cùng.
- Tôi cũng đã cố gắng với SO_LINGER và 10 giây, không thành công hoặc
tôi gọi send() nhiều lần (khối nhỏ) và từ phía khách hàng 53 byte được chuyển giao. Máy chủ gọi recv() nhiều lần (yêu cầu 4 byte) và đọc 49 byte và sau đó trả về 0 (54 Byte - 49 Bytes, vì vậy 4 byte bị thiếu).
MSDN và một số diễn đàn viết cho non-blocking socket:
- recv() chắc chắn trả < 0 về lỗi và errno/WSAGetLastError được thiết lập
- recv() chắc chắn trả về = 0 khi phía bên kia đóng kết nối
- recv() chắc chắn trả về> 0 khi dữ liệu đã được đọc
MSDN cũng nói:
Sử dụng chức năng đóng hoặc tắt máy với SD_SEND hoặc SD_BOTH dẫn đến tín hiệu RELEASE được gửi đi trên kênh điều khiển. Do để sử dụng các kênh tín hiệu và dữ liệu riêng biệt của ATM, có thể tín hiệu RELEASE có thể đạt đến đầu từ xa trước khi dữ liệu cuối cùng đến đích, dẫn đến mất dữ liệu đó. Một các giải pháp khả thi có thể lập trình một sự chậm trễ đầy đủ giữa dữ liệu được gửi gần nhất và chức năng đóng cửa hoặc chức năng tắt máy sẽ yêu cầu một ổ cắm ATM .
này được coi trong ví dụ về recv() và send(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
Nhưng vẫn không thành công, tôi vẫn nhận được một số ngắt trong 10% của tất cả các kết nối sau khi Byte 49 được nhận, 90 % kết nối thành công. Bất kỳ ý tưởng? Cám ơn.
Tôi nghi ngờ bạn đang tạo một trong một số lỗi lập trình socket cổ điển.Tôi có một vài ý tưởng, nhưng tôi muốn xem mã của bạn trước khi viết một cái gì đó lên. – selbie