Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#服务器-套接字未连接且内存不足异常_C#_Sockets_Server - Fatal编程技术网

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

C#服务器-套接字未连接且内存不足异常,c#,sockets,server,C#,Sockets,Server,我正在尝试实现一个简单的TCP服务器,我基本上复制了几个行的示例SAN,并尝试使其工作。我有一个外部客户端正在尝试连接。 这是我的代码: IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPEndPoint localEP = new IPEndPoint(ipHostInfo.AddressList[0], 4001); Socket listener = new Socket(localEP.Address.Addres

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

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

我基本上有两个问题:

  • 如果我使用while循环,我会得到一个OutOfMemoryException

  • 我从未设法连接到客户端

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

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

    试着这样做:

    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);
    }
    

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

    对于基本TCP,我建议使用简单方法和同步方法。 Accept()被阻塞,因此程序流将停止,直到有一个传入连接

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

    不,这只是一个基本的例子。如果你想保持你的连接,你可能会考虑一个新的线程,每个接受的套接字,不断与接收和发送数据。< / P>对不起,我添加它!但它甚至没有收到回电。谢谢你看起来一直在给BeginAccept打电话。如果您希望在中处理accept,而您可能希望使用阻塞调用,而不是异步调用。您在MSDN页面中遗漏的部分看起来是线程同步位,这将阻止无限、非阻塞循环。如果我尝试接受多个连接,那么这样做会不会令人迷惑?我将尝试找出如何使线程同步位工作,谢谢!糟糕的文章。。。请看一下这个关于如何构建异步TCP服务器和客户端的演示:轮询循环不是无限循环的解决方案。当然,使用异步方法的目的是使线程不会被阻塞,这正是您使用Thread.Sleep所做的。@Ceisc您可以替换Thread.Sleep和您的部分代码。。。我将编辑该部分。while循环的要点是,在被告知正在处理初始接受后,它将再次开始等待连接。打破它并让处理程序内再次调用BeginAccept,则完全不需要while循环。@usr我没有说这是一个最佳解决方案,但它将解决他的内存不足问题。