2014-02-13 98 views
-1

我使用VS 2008來實現一個從客戶端獲取套接字連接的服務器。 我爲此使用了MSDN示例代碼,它真的適合我第一次使用。 我的來自客戶端作者的信息是,在第一次請求之前,它嘗試握手,然後發送其第一個請求。我真的很好。 然後我發送響應到客戶端,並獲得它。 但現在我的問題開始: 客戶端開始發送請求,但我什麼都沒有! 我不確定我的實現,因爲在MSDN示例中只有一個請求。 任何人都可以解釋得到第一個請求和第二個請求之間應該有什麼區別?我應該爲每個請求使用Socket.Accept(),還是在從Socket.Accept()函數獲取了套接字後,我只需使用Socket.Receive()?套接字服務器沒有得到第二個請求

我的代碼是基於MSDN樣本是在這裏:

listener.Bind(localEndPoint); 

listener.Listen(10); 

// Start listening for connections. 

Console.WriteLine("Waiting for a connection..."); 

// Program is suspended while waiting for an incoming connection. 

Socket handler = listener.Accept(); 

data = null; 

SocketError errorCode; 

// An incoming connection needs to be processed. 

while (true) 

{ 

bytes =new byte[1024]; 

handler.ReceiveTimeout = 2000; 

int bytesRec = handler.Receive(bytes,0,1024,0,out errorCode); 

data +=Encoding.ASCII.GetString(bytes, 0, bytesRec); 


Console.WriteLine("Text received : {0}", data); 

string answer = "my answer to client"; 

// Echo the data back to the client. 

byte[] msg = Encoding.ASCII.GetBytes(answer); 

handler.Send(msg); 


} 

我的結果是我第一次獲得bytesRec一些數據,並傳送給客戶端的響應。然後我再也沒有收到bytesRec的任何內容,但是由於超時錯誤,收到的內容會中止。

由於提前,

+0

你介意格式化你的代碼,使它可讀嗎? –

回答

1

你叫Socket.Receive()多次,因爲它需要接收的每個消息,然後進行調用它接收下一個消息,依此類推。

注意,在連接的一端的Receive()調用是在一一對應於在另一端的Send()呼叫。如果你想發送「消息」,通常由你來實現這一點在套接字的頂部 - 例如,用每個消息的長度作爲前綴,使用固定長度的消息等,或使用更高級別的網絡原語。


所以要Receive()單個呼叫可能只檢索部分的消息的,或檢索的多個消息,或檢索一個消息,一個或多個完整的消息,和其它消息的開始的端部,等等

+0

從客戶端獲取數據後,Socket.Recieve()很好。這裏沒有任何數據被插入我的套接字中......所以,你能解釋一下Accept和Recieve嗎? – gelly

+0

@gelly - 如果您希望我們診斷/調試您的代碼,您將不得不向我們展示一些代碼。也許如果你可以創建一個[SSCCE](http://sscce.org/)並告訴我們,我們可以幫助你。 –

+0

用代碼編輯我的問題。謝謝。 – gelly

相關問題