【发布时间】:2015-03-03 15:51:56
【问题描述】:
我正在尝试实现一个简单的 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
我基本上有两个问题:
如果我使用 while 循环,我会得到 OutOfMemoryException
我从来没有设法连接到客户端
关于这两个问题中的任何一个的任何提示?先感谢您!
【问题讨论】:
-
对不起,我加了!但它甚至从未进入回调。谢谢!
-
您似乎一直在调用 BeginAccept。如果你想在 while 内处理接受,你可能需要一个阻塞调用而不是异步调用。
-
您从 MSDN 页面中遗漏的部分看起来是线程同步位,它可以防止无限的非阻塞循环。
-
如果我试图接受多个连接,这样做是否明智?我将尝试弄清楚如何使线程同步位起作用,谢谢!
-
糟糕的文章...请看这个关于如何构建异步TCP服务器和客户端的演示:github.com/vtortola/AynchronousTCPListener