我正在尝试实现一个简单的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
我从未设法连接到客户端
关于这两个问题中的任何一个的任何提示?先感谢您!
答案 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);
}