2012-05-10 46 views
5

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.

+0

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

Trả lời

9

recv() trả về 0 chỉ khi bạn yêu cầu bộ đệm 0 byte hoặc ngang hàng khác đã ngắt kết nối một cách duyên dáng. Nếu bạn không nhận được tất cả dữ liệu bạn đang mong đợi, thì bạn không đọc dữ liệu chính xác để bắt đầu. Vui lòng cập nhật câu hỏi của bạn bằng mã thực tế của bạn.

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