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
我基本上有两个问题:
如果我使用while循环,我会得到OutOfMemoryException
我从来没有设法连接到客户端
关于这两个问题,有什么建议吗?提前谢谢!
您的问题是,您一直使用异步调用。没有等待机制或类似机制,所以通常您只是在无限循环中创建新的异步回调。
对于基本的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);
}