C#服务器-套接字未连接,内存不足异常

本文关键字:内存不足 异常 连接 服务器 套接字 | 更新日期: 2024-09-25 05:25:41

我正在尝试实现一个简单的TCP服务器,我基本上在MSDN上复制了这个示例,只需几行代码,并试图使其正常工作。我有一个外部客户端正在尝试连接。这是我的代码:

IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
 IPEndPoint localEP = new IPEndPoint(ipHostInfo.AddressList[0], 4001);
 Socket listener = new Socket(localEP.Address.AddressFamily,
     SocketType.Stream, ProtocolType.Tcp);
 try
 {
     listener.Bind(localEP);
     listener.Listen(1000);
    while (true)
     {
         listener.BeginAccept(new AsyncCallback(AcceptCnxCallback), listener);
     }
 }
 catch (Exception e)
 {
   //Log here
 }

这是我的回拨:

private void AcceptCnxCallback(IAsyncResult iar)
{
    MensajeRecibido msj = new MensajeRecibido();
    Socket server = (Socket)iar.AsyncState;
    msj.workSocket = server.EndAccept(iar);
}

这是其中一个传入包裹的信息:

TCP:[SynReTransmit #1727889]Flags=......S., SrcPort=57411, DstPort=4001, PayloadLen=0, Seq=673438964, Ack=0, Win=5840 ( Negotiating scale factor 0x4 ) = 5840  

来源:10.0.19.65目的地:10.0.19.59

我基本上有两个问题:

  1. 如果我使用while循环,我会得到OutOfMemoryException

  2. 我从来没有设法连接到客户端

关于这两个问题,有什么建议吗?提前谢谢!

C#服务器-套接字未连接,内存不足异常

您的问题是,您一直使用异步调用。没有等待机制或类似机制,所以通常您只是在无限循环中创建新的异步回调。

对于基本的TCP,我建议使用简单的方法并使用同步方法。Accept()正在阻塞,因此程序流将停止,直到有一个正在进行的连接。

while (true)
{
    Socket s = listener.Accept();
    buffer = new byte[BUFFER_SIZE];
    s.Receive(buffer);
    //Do something
    s.Send(...);
}

Noe认为这只是一个基本的例子。如果你想保持连接,你可以为每个接受的套接字考虑一个新的线程,它继续接收和发送数据。

第一个问题您正在使用一个无限循环来调用一个异步方法。

这样试试:

listener.BeginAccept(new AsyncCallback(AcceptCnxCallback), listener);
//add your code here (this part will be executed wile the listner is waiting for a connection.
while (true)
     {

         Thread.Sleep(100);
     } 

并将回调方法更改为:

private void AcceptCnxCallback(IAsyncResult iar)
{
    MensajeRecibido msj = new MensajeRecibido();
    Socket server = (Socket)iar.AsyncState;
    msj.workSocket = server.EndAccept(iar);
//call again the listener after you get a message
listener.BeginAccept(new AsyncCallback(AcceptCnxCallback), listener);
}