2011-10-05 30 views
7

Chỉ NetworkStream.Write chặn cho đến khi nó đặt dữ liệu được gửi vào bộ đệm gửi TCP hoặc nó sẽ chặn cho đến khi dữ liệu thực sự được ACK nhận bởi máy chủ nhận không?Điều kiện nào khiến NetworkStream.Write chặn?

Lưu ý: Ổ cắm được cấu hình để chặn I/O.

Chỉnh sửa: Rất tiếc, không có điều nào như TcpClient.Write tất nhiên! Chúng ta đều hiểu rằng chúng ta đang nói về TcpClient.GetStream().Write, thực ra là NetworkStream.Write!

Trả lời

7

Trừ .net đang sử dụng một cái gì đó khác hơn winsock, sau đó theo các tài liệu tham khảo winsock:

Việc hoàn tất thành công chức năng gửi không cho biết rằng dữ liệu đã được gửi và nhận thành công đến người nhận. Chức năng này chỉ cho biết dữ liệu đã được gửi thành công.

Nếu không có dung lượng đệm trong hệ thống vận chuyển để giữ dữ liệu được truyền đi, gửi sẽ chặn trừ khi ổ cắm được đặt ở chế độ không chặn. Trên các khe cắm định hướng luồng không chặn, số byte được ghi có thể nằm trong khoảng từ 1 đến độ dài được yêu cầu, tùy thuộc vào khả năng đệm trên cả máy khách và máy chủ.

Giả sử ghi là gửi bên dưới, sau đó giải thích nghiêm ngặt tài liệu winsock sẽ chỉ ra rằng không có gurantee rằng dữ liệu đã làm cho đầu kia của đường ống khi nó quay trở lại.

Dưới đây là liên kết đến tài liệu winsock tôi trích dẫn từ: http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=VS.85).aspx

+0

+1 để hiển thị tham chiếu. Tôi chưa tìm thấy bất kỳ tài liệu nào khác về chủ đề này, vì vậy tôi giả định những gì bạn đang trích dẫn từ có lẽ là chính xác. –

+1

+1 Làm tốt công việc giới thiệu (thật khó để tìm thấy tài liệu về cái mà tôi vừa mới nhận) – tcarvin

+0

(Và vâng, .NET đang sử dụng ổ cắm hệ điều hành Winsock trên Windows.) –

-1

TcpClient.Write sẽ chặn cho đến khi bộ đệm gói đã được chuyển sang mạng và ACK thích hợp đã được nhận. Bạn sẽ nhận thấy rằng một kết nối bị ngắt thường sẽ kết thúc ném một ngoại lệ về hoạt động Write, vì nó chờ ACK nhưng không nhận được một trong khoảng thời gian chờ đã xác định.

1

Tôi không đồng ý với cả hai câu trả lời [nêu rõ rằng nó chặn]. Việc ghi vào ổ cắm TCP/IP không chặn trừ khi bộ đệm cơ bản đã đầy dữ liệu chưa được biết. Nói chung, nó không chặn nhưng chỉ được giao cho việc thực hiện TCP. Nhưng tất nhiên bây giờ tôi phải đi theo dõi một số tài liệu tham khảo để trở lại này lên :)

Từ SO

+0

tôi dường như được nhìn thấy câu trả lời của bạn là đúng trên Mono, trong khi câu trả lời khác dường như đúng trên Windows. Tôi vô cùng bối rối. Hy vọng rằng bạn sẽ tìm thấy tài liệu tham khảo, bởi vì tôi không thể tìm thấy bất cứ điều gì kết luận. –

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