C#服务器-套接字未连接且内存不足异常
我正在尝试实现一个简单的TCP服务器,我基本上复制了几个行的示例SAN,并尝试使其工作。我有一个外部客户端正在尝试连接。 这是我的代码: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
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
我基本上有两个问题:
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我没有说这是一个最佳解决方案,但它将解决他的内存不足问题。