2010-03-29 33 views
5

Tôi đang viết máy chủ và máy khách TCP tùy chỉnh và thực hiện một tấn yêu cầu (chính xác là 60.000) Tôi bắt đầu gặp lỗi socket này là 10048, trong đó should mean "địa chỉ đã được sử dụng".Lỗi socket 10048 trên máy khách? Nguyên nhân có thể?

Lỗi xảy ra trừ khi tôi tạm dừng quá trình trong 2 hoặc 3 phút và sau đó bắt đầu lại, sau đó bắt đầu phát ra lỗi tương tự trong một thời gian ngắn sau khi khởi động lại. Nếu tôi tạm dừng quá trình khách hàng và khởi động lại quá trình máy chủ, tôi vẫn nhận được lỗi tương tự trên máy khách. Vì vậy, nó là một vấn đề phía khách hàng hoàn chỉnh.

Điều này không có ý nghĩa mặc dù, lỗi này thường chỉ xảy ra khi ràng buộc và lỗi này xảy ra trên máy khách chứ không phải máy chủ. Điều gì có thể là lý do có thể cho nó?

Một trích đoạn nhỏ khởi tạo của tôi:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

Ngoài ra, mọi thứ khác dường như được làm việc tốt (bao gồm cả số lượng thời gian cần thiết để gửi qua lại) và các công trình này một cách hoàn hảo khi sử dụng 127.0.0.1 nhưng khi đặt nó trên một máy tính LAN khác, tôi bắt đầu nhận được lỗi 10048.

Có điều gì sai với cách tôi khởi chạy không? Điều gì khác có thể gây ra lỗi này ở phía khách hàng?

Trả lời

9

Xem http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. Bạn cần DontLinger hoặc ReuseAddr, hoặc cả hai, tôi không chắc chắn. Về cơ bản, các ổ cắm của bạn bị kẹt trong trạng thái TIME_WAIT trong một thời gian sau khi bạn ngắt kết nối TCP, khi bạn có đủ kết nối, bạn sẽ không thể tạo bất kỳ kết nối máy khách mới nào. Xác minh điều này với đầu ra chương trình netstat -na.

Bạn cũng có thể làm giảm thời gian ổ cắm mà vẫn trong trạng thái TIME_WAIT bằng cách thay đổi nó trong registry: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx Mặc định là 4 phút mà có lẽ có thể được giảm xuống còn 1 hoặc 2 phút một cách an toàn, đặc biệt là để thử nghiệm.

Tuyên bố từ chối trách nhiệm: Tôi không phải là guru TCP bằng bất kỳ phương tiện nào.

+0

tôi đã thêm 'client.LingerState = LingerOption mới (false, 0); 'và sử dụng netstat, phải không bạn, tôi có một tải tào lao của các kết nối trong TIME_WAIT – Earlz

+0

Ý tôi là, tôi vẫn còn nhiều TIME_WAIT sau khi thêm 'LingerState' bit – Earlz

+0

ReuseAddr cũng không hữu ích. – Earlz

0
+0

Nếu đây là lý do, thì làm thế nào nó hoạt động tốt bất cứ khi nào tôi sử dụng localhost? – Earlz

+1

@Earlz: Có thể là do các kết nối trên 127.0.0.1 sử dụng thời gian phân đoạn tối đa rất thấp (0?), Vì chúng tôi thực sự không thể nhận các gói dữ liệu lang thang. Tôi đã không thể tìm thấy bất cứ điều gì về điều này bằng cách googling, nhưng nó sẽ có ý nghĩa. Bạn có thể thử và sử dụng một giao diện IP và xem nếu điều này làm cho nó tái sản xuất trên máy địa phương - mặc dù điều này có thể được tối ưu hóa là tốt. Ngoài ra, hãy xem cài đặt TcpTimedWaitDelay thành 30 giây (http://msdn.microsoft.com/en-us/library/ms819739.aspx) trên máy chủ, nếu có thể –

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