2012-08-10 142 views
0

我的問題:當客戶端嘗試通過Socket.BeginReceive連接到服務器時,服務器無響應。我試過整合一個try/catch區塊,但這被證明是無用的。甚至在VS調試器中,不是給我一個錯誤日誌,它只是進入Windows 7「程序無響應」屏幕。服務器未響應'Socket.BeginReceive'

它不會一直髮生......只有在大約5或6次成功連接和斷開連接之後。

下面是相關代碼(服務器端,因爲崩潰發生服務器端):

public Remote(Socket s) 
{ 
    tempbuffer = new byte[300]; 
    buffer = new byte[0]; 
    connectionSocket = s; 
    ip = connectionSocket.RemoteEndPoint.ToString().Split(':')[0]; 
    Log(ip + " connecting..."); 

    connectionSocket.BeginReceive(
     tempbuffer, 0, tempbuffer.Length, SocketFlags.None, 
      new AsyncCallback(Receive), this); 
} 

Receive方法:

static void Receive(IAsyncResult result) 
{ 
    Remote r = (Remote)result.AsyncState; 
    if (r.disconnected) return; 

    try 
    { 
     int length = r.connectionSocket.EndReceive(result); 
     if (length == 0) { r.Disconnect(); return; } 

     byte[] b = new byte[r.buffer.Length + length]; 
     Buffer.BlockCopy(r.buffer, 0, b, 0, r.buffer.Length); 
     Buffer.BlockCopy(r.tempbuffer, 0, b, r.buffer.Length, length); 

     r.buffer = r.HandleMessage(b); 

     r.connectionSocket.BeginReceive(
      r.tempbuffer, 0, r.tempbuffer.Length, SocketFlags.None, 
       new AsyncCallback(Receive), r); 
    } 
    catch (SocketException) { r.Disconnect("Error!"); } 
    catch (Exception e) { ErrorLog(e); r.Disconnect("Error!"); } 
} 

我看到ip connecting消息,但隨後後,它是反應遲鈍。當它這樣做時,Receive方法從不會被調用。

有誰知道爲什麼會發生這種情況?

+0

它太少的代碼來找出可能是錯誤的。另外,如果你在'Receive'中設置了一個斷點,它會被調用嗎? – 2012-08-10 06:09:07

+0

你在調用相應的'EndReceive'嗎?我想知道如果你打開這麼多的連接(而不是關閉它們),服務器會停止響應新的請求... – 2012-08-10 10:25:10

+0

當程序掛起時,打開調試器並查看'Threads'視圖。 你總是*應該調用'EndReceive';你不應該麻煩檢查'r.disconnected'。你可以使用'MemoryStream'來代替嘗試自己使用字節緩衝區。 – EricLaw 2015-03-20 18:00:49

回答

0

要麼你給它一個無效的IP和端口連接或異步接收的實現只是永遠重複的事情。

+0

對不起,忘記提及崩潰是服務器端;編輯到後大聲笑... – Jonny 2012-08-10 00:41:39

+0

這是一個公然的猜測基於沒有證據。回答不好。 – 2012-08-10 10:25:35