双向使用C#套接字
我有一个简单的C#Windows演示框架程序,它生成了一个TCP侦听器。这个TCP侦听器从一个连接中接受一个套接字,然后我希望它能够接收和发送数据 我不确定如何使用同一个套接字来实现这一点,所以我设置了这个循环 基本上是在每个循环的开始,用超时(我认为是10毫秒)检查新数据,然后不管新数据如何处理发送数据(如果适用)。如果我没有超时,我就不能在没有先接收数据的情况下发送数据,因为调用socket.recieve会阻塞,直到我们有了一些东西 但是,此超时会导致我的应用程序出现可怕的延迟。尽管在不同的框架下运行!从测试中,只要我删除超时,延迟就会消失。因此,我相当有信心这就是问题所在 这让我想,这样做是错误的吗?我应该改为使用异步接收调用吗?我不认为这是解决办法,但我不确定。有更好的方法吗?我猜故意抛出此异常对性能非常不利双向使用C#套接字,c#,wpf,sockets,c#-4.0,tcp,C#,Wpf,Sockets,C# 4.0,Tcp,我有一个简单的C#Windows演示框架程序,它生成了一个TCP侦听器。这个TCP侦听器从一个连接中接受一个套接字,然后我希望它能够接收和发送数据 我不确定如何使用同一个套接字来实现这一点,所以我设置了这个循环 基本上是在每个循环的开始,用超时(我认为是10毫秒)检查新数据,然后不管新数据如何处理发送数据(如果适用)。如果我没有超时,我就不能在没有先接收数据的情况下发送数据,因为调用socket.recieve会阻塞,直到我们有了一些东西 但是,此超时会导致我的应用程序出现可怕的延迟。尽管在不同
System.Net.IPAddress localAddr = System.Net.IPAddress.Parse("127.0.0.1);
TcpListener mListener = new TcpListener(localAddr, 5000);
var thread = new System.ThreadingThread(() => {
mListener.Start();
//Loop Forever
mListener.Start();
while(true){
Socket client = mListener.AcceptSocket();
client.ReceiveTimeout = 10;
while(true){
byte[] data = new byte[5000];
int returnsize = 0;
try{
returnSize = client.Recieve(data);
}catch(Exception e){
//Client Timeout!
//We will catch a data on the next loop
}
//now here I would check here if a queue has data to send
//if so use client.send
//proceed to next loop
}
}
});
thread.Start();
谢谢你的帮助 “这是一种错误的方法吗?我应该使用异步接收调用吗?”--是的,这是一种错误的方法。不应使用轮询处理I/O。是的,异步I/O是一种更好的方法,原因很多。NET套接字支持有许多不同的异步API可供选择,所有这些API都运行良好。现代代码可能应该使用
NetworkStream
包装套接字,或者使用TaskFactory.fromsync()
方法,以便可以使用async
/wait
。请做一些研究,只有当你有特定的问题要问的时候才发布一个问题。你可以使用像Signal这样的东西,而不是重新发明双工通信的轮子。+1对于Signal,我已经在许多项目中使用过它。它的好处在于,它将在可用时使用WebSocket,而在不可用时使用长轮询模拟WebSocket。