2011-08-21 30 views
3

長時間休息後,我試圖刷新我對System.Net.Sockets的記憶,但是即使連接2臺機器,我也遇到了問題。由於套接字未連接,因此不允許發送或接收數據的請求。 。

例外:發送或接收數據的請求,但不允許的,因爲在插座沒有被連接和沒有提供地址

服務器代碼(使用sendto調用發送數據報套接字時):

private void startButton_Click(object sender, EventArgs e) 
     { 
      LocalEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.103"), 4444); 
      _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      _Socket.Bind(LocalEndpoint); 
      _Socket.Listen(10); 
      _Socket.BeginAccept(new AsyncCallback(Accept), _Socket); 
     } 

private void Accept(IAsyncResult _IAsyncResult) 
     { 
      Socket AsyncSocket = (Socket)_IAsyncResult.AsyncState; 
      AsyncSocket.EndAccept(_IAsyncResult); 

      buffer = new byte[1024]; 

      AsyncSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), AsyncSocket); 
     } 

     private void Receive(IAsyncResult _IAsyncResult) 
     { 
      Socket AsyncSocket = (Socket)_IAsyncResult.AsyncState; 
      AsyncSocket.EndReceive(_IAsyncResult); 

      strReceive = Encoding.ASCII.GetString(buffer); 

      Update_Textbox(strReceive); 

      buffer = new byte[1024]; 

      AsyncSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), AsyncSocket); 
     } 

客戶端代碼:

private void connectButton_Click(object sender, EventArgs e) 
     { 
      RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.103"), 4444); 
      _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      _Socket.BeginConnect(RemoteEndPoint, new AsyncCallback(Connect), _Socket); 
     } 

private void Connect(IAsyncResult _IAsyncResult) 
     { 
      Socket RemoteSocket = (Socket)_IAsyncResult.AsyncState; 
      RemoteSocket.EndConnect(_IAsyncResult); 
     } 
+0

錯誤發生在調試服務器代碼 – RStyle

+0

哪一行拋出異常? – svick

回答

5

的錯誤是由於在您的接受功能下面一行:

AsyncSocket.EndAccept(_IAsyncResult); 

服務器偵聽到特定的插座,並用它來接受來自客戶端連接。您不能使用相同的套接字來接受連接並從客戶端接收數據。如果你看看Socket.EndAccept的幫助,它會說它創建一個新的Socket來處理遠程主機通信。在你的代碼中,你使用_Socket來監聽客戶端連接並接收數據。您可以修改此行:

Socket dataSocket = AsyncSocket.EndAccept(_IAsyncResult); 

您還需要這個新的socket傳遞給BeginReceive功能參數爲:

AsyncSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(Receive), dataSocket); 
+0

這非常有幫助,而且很容易犯這樣的錯誤。 – Zapnologica

相關問題