2011-12-24 1 views
0

この問題が発生する可能性がある場所は?SocketExceptionシステムに十分なバッファスペースがないか、またはキューがいっぱいになったために、ソケットの操作を実行できませんでした

のSocketExceptionシステムに十分なバッファスペースを欠いていたため、ソケット操作を実行できませんでしたか、キューが

Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 50509); 
EndPoint tmpRemote = (EndPoint)(sender); 

newsock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
newsock.Bind(ipep); 

    while (thread_Listen == true && work == true) 
     { 
      try 
      { 
       Object state = new Object(); 
       **>> at this place >>** newsock.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref tmpRemote, new AsyncCallback(DoReceiveFrom), state); 
       Array.Clear(buffer, 0, buffer.Length); 
      } 
      catch (SocketException ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

FUNC DoReceiveFrom

private void DoReceiveFrom(IAsyncResult iar) 
{ 
    try 
    { 
     Socket recvSock = (Socket)iar.AsyncState; 
     EndPoint clientEP = new IPEndPoint(IPAddress.Any, 0); 
     int msgLen = recvSock.EndReceiveFrom(iar, ref clientEP); 
     byte[] localMsg = GetAndCleanPacket(buffer); 
     string[] packet = Encoding.ASCII.GetString(localMsg).Split(new Char[] { '|' }); 
     if (packet.Length > 0) 
     { 
      if (packet[0] == "ms") 
      { 
       // Connect 
       if (packet[1] == "c") MSc(ip[0], packet[9], packet, clientEP); 
       else if (packet[1] == "s") MSs(ip[0], packet); 
       else if (packet[1] == "d") MDc(ip[0], packet); 
      } 
      else if (packet[0] == "p") ping(clientEP); 
      else if (packet[0] == "sList") serverList(clientEP); 
      else if (packet[0] == "bi") brGetInfo(packet, clientEP); 
      else if (packet[0] == "error") AddError(packet[1], packet[2]); 
     } 
    } 
    catch (InvalidOperationException) 
    { 
    } 
    catch (SocketException) 
    { 
    } 
    catch (Exception e) 
    { 
     errors.Add(e.ToString()); 
    } 
} 
+0

バッファ配列の長さはどのくらいですか? – Elastep

+0

1024はtryed 2048ですが、同じ例外があります – SLI

+0

DoReceiveFromはどのように見えますか? –

答えて

1
どのように見えるか、このいっぱいだったので、

whileループはBeginReceiveFrom()を非常に高い頻度で呼び出します。オペレーティングシステムがプラグを抜き、さらに多くのリソースを割り当てることを拒否するまで、数分の1秒以上かかることはありません。

あなたは何かを受け取った後でのみ、BeginReceiveFromを呼び出す必要があります。 DoReceiveFrom()内。

+0

ありがとう、それを得た! – SLI

関連する問題