C#Server - 套接字没有连接和内存不足异常

时间:2015-03-03 15:51:57

标签: c# sockets server

我正在尝试实现一个简单的TCP服务器,我基本上复制了示例on 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. 我从未设法连接到客户端

  3. 关于这两个问题中的任何一个的任何提示?先感谢您!

2 个答案:

答案 0 :(得分:1)

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

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

while (true)
{
    Socket s = listener.Accept();

    buffer = new byte[BUFFER_SIZE];
    s.Receive(buffer);
    //Do something
    s.Send(...);

}

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

答案 1 :(得分:-2)

[编辑]
我建议阅读这篇文章 http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server
它使用TcpListener tcpListener;

中的System.Net.Sockets;

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

尝试这样:

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

     } 

并将Callback方法更改为:

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