2012-06-13 28 views
5

Tôi có máy chủ C# socket. Số lượng khách hàng lớn nhất đếm được ai có thể kết nối với máy chủ khoảng 800. Nếu khách hàng hơn 800 khách hàng mới gặp lỗi socket WSAECONNREFUSED 10061. Số khách hàng tối đa của raizeup được tính như thế nào?C# Socket Server không có hơn 800 máy khách

Ổ ghi giữa socket.BeginXXX và socket.EndXXX. Mục tiêu: khung 4.0. Giao thức: IP4, TCP

+2

Âm thanh như hàng đợi của người nghe đã đầy. Bạn có thể dán một số mã không? –

+0

Một bộ định tuyến hoặc tường lửa cũng có thể giới hạn phạm vi của các cổng khả dụng. – Groo

+0

@Groo chỉ có một cổng ở đây, cổng mà máy chủ đang nghe. – EJP

Trả lời

1

Khi đặt serverocket thành trạng thái nghe, bạn có thể đặt backlog. Đó là số lượng kết nối tối đa có thể đợi để được chấp nhận.

Mọi thứ khác có thể là sự cố phần cứng - hãy thử chạy chương trình trên một máy khác.

Dưới đây là một ví dụ về một

Socket serversocket = ... 
serversocket.Listen(1000); 
+0

Vấn đề phần cứng như thế nào? Làm thế nào phần cứng có thể gây ra TCP reset và từ chối kết nối? – EJP

+0

Tôi đã suy nghĩ dọc theo các dòng của card mạng. Giả thuyết của nó có thể hoàn toàn không liên quan. – Johannes

3

Hàng đợi nghe tồn đọng đầy. Khi hàng đợi tồn đọng đã đầy, Windows sẽ bắt đầu gửi các RST đến các kết nối đến xa hơn, trở thành 'kết nối bị từ chối' tại (các) client có liên quan. Bạn có thể tăng chiều dài hàng đợi tồn đọng theo các câu trả lời khác ở đây, nhưng điều thực sự có nghĩa là bạn không xử lý chấp nhận đủ nhanh. Hãy nhìn vào mã mà làm điều đó, và mỡ đường dẫn. Đảm bảo rằng nó không làm bất cứ điều gì khác, chẳng hạn như chặn I/O, I/O đĩa, các hoạt động mạng khác. Khi kết nối được chấp nhận, nó sẽ bị tắt khỏi hàng đợi tồn đọng để các kết nối khác có thể thành công.

2

Xin chào tôi tìm câu trả lời cho câu hỏi của mình. Tôi tạo thêm thread để chấp nhận kết nối. Ví dụ:

Previous

IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Parse(_serverAddress), _port); 
_serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

_serverSocket.Bind(myEndpoint); 
_serverSocket.Listen((int)SocketOptionName.MaxConnections); 

_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); 

..... 


private void AcceptCallback(IAsyncResult result) 
     { 
      ConnectionInfo connection = new ConnectionInfo(); 
      try 
      { 
       Socket s = (Socket)result.AsyncState; 
       connection.Socket = s.EndAccept(result); 

       connection.Buffer = new byte[1024]; 
       connection.Socket.BeginReceive(connection.Buffer, 
        0, connection.Buffer.Length, SocketFlags.None, 
        new AsyncCallback(ReceiveCallback), 
        connection); 
      } 
      catch (SocketException exc) 
      { 
       CloseConnection(connection, "Exception in Accept"); 
      } 
      catch (Exception exc) 
      { 
       CloseConnection(connection, "Exception in Accept"); 
      } 
      finally 
      { 

        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState); 
      } 
     } 

Bằng cách kết nối khách hàng theo cách này đếm không raize 800

Hiện nay tôi viết những dòng này:

IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Parse(_serverAddress), _port); 
_serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

_serverSocket.Bind(myEndpoint); 
_serverSocket.Listen((int)SocketOptionName.MaxConnections); 

acceptThread = new Thread(new ThreadStart(ExecuteAccept)); 
acceptThread.Start(); 

...... 

private void ExecuteAccept() 
     { 

      while (true) 
      { 

       ConnectionInfo connection = new ConnectionInfo(); 
       try 
       { 
        connection.Socket = _serverSocket.Accept(); 

        connection.Buffer = new byte[1024]; 
        connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), connection); 
       } 
       catch (SocketException exc) 
       { 
        CloseConnection(connection, "Exception in Accept"); 
       } 
       catch (Exception exc) 
       { 
        CloseConnection(connection, "Exception in Accept"); 
       } 
      } 
     } 

Bằng cách kết nối khách hàng theo cách này đếm raize hơn 2000. Đọc và viết tôi làm với BeginXXX và EndXXX.

+0

Tôi rất bối rối vì ai đó có thể làm sáng tỏ điều này ... nếu tôi có vòng lặp tạo 1000 kết nối cho người nghe ... tại sao tôi lại nhận được thông tin bổ sung: Không có kết nối nào vì máy mục tiêu chủ động từ chối nó "khi có một backlog giống như MaxConnectoins = 2147483647 ... làm thế nào để tôi mã để theo dõi điều này trên người nghe ... tức là làm thế nào để tôi biết khi người nghe sẽ từ chối kết nối ... asuming đó là những gì nó đang làm. Mã lỗi 10061 plz help thx – Seabizkit

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