Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
双向使用C#套接字_C#_Wpf_Sockets_C# 4.0_Tcp - Fatal编程技术网

双向使用C#套接字

双向使用C#套接字,c#,wpf,sockets,c#-4.0,tcp,C#,Wpf,Sockets,C# 4.0,Tcp,我有一个简单的C#Windows演示框架程序,它生成了一个TCP侦听器。这个TCP侦听器从一个连接中接受一个套接字,然后我希望它能够接收和发送数据 我不确定如何使用同一个套接字来实现这一点,所以我设置了这个循环 基本上是在每个循环的开始,用超时(我认为是10毫秒)检查新数据,然后不管新数据如何处理发送数据(如果适用)。如果我没有超时,我就不能在没有先接收数据的情况下发送数据,因为调用socket.recieve会阻塞,直到我们有了一些东西 但是,此超时会导致我的应用程序出现可怕的延迟。尽管在不同

我有一个简单的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。