【问题标题】:socket time out in socket programming套接字编程中的套接字超时
【发布时间】:2014-04-26 18:58:49
【问题描述】:

我有一个硬件而不是加入到 ad hoc 网络中的笔记本电脑(服务器)。

当服务器单独发送数据时,它可以正常工作。并且客户端单独发送数据,也可以正常工作。

但是当服务器和客户端一起发送数据时,经过一段时间,就会发生超时。

在 35 之后,有时会出现 33 包超时。

我更改了硬件的传输速率,但它也断开了连接。

虽然硬件支持全双工。

超时后,我 ping 硬件,它不在端口上。

并检查服务器上的端口,它是开放的。

我该怎么办?

byte[] bytes = new byte[512];
        //try
        //{

            IPHostEntry ipHost = Dns.GetHostEntry("");
            // Gets first IP address associated with a localhost 
            IPAddress add = ipHost.AddressList[3];


            TcpListener tcpListener = new TcpListener(add, 6000);
            tcpListener.Start();



            TcpClient tcpClient = tcpListener.AcceptTcpClient();


            NetworkStream stream = tcpClient.GetStream();

            String data = null;
            while (true)
            {
                int j = 0;
                int i;
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    j = j + 1;
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                    AddItem("j="+j+" Received:"+ data);

                    // Process the data sent by the client.
                    //data = data.ToUpper();

                    byte[] msg = System.Text.Encoding.ASCII.GetBytes("thanks");

                    // Send back a response.
                    stream.Write(msg, 0, msg.Length);
                    AddItem("Sent:"+"thanks");


                }
                // Shutdown and end connection
                tcpClient.Close();

【问题讨论】:

    标签: c#


    【解决方案1】:

    标准的套接字调用都是阻塞的,所以如果两个参与者都在互相发送消息,他们都会等待对方接收他们发送的消息,从而导致deadlock

    在.NET中,有三种典型的解决方案:

    • Microsoft 有一个用于asynchronous socket activity 的并行 API。它需要比您的示例更多的开销代码,但几乎以类似 Windows 的方式处理所有内容。
    • 在使用Socket.Select() 编写代码之前,您可以通过测试可读数据自行处理异步活动。这是一种典型的投票方法,但您自己做所有事情,需要确保没有饥饿或其他偏见。
    • 将您的ReadWrite 代码放在不同的线程中,这样阻塞一个不会阻塞整个程序。

    【讨论】:

    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 2012-03-08
    • 2011-05-11
    • 2013-09-08
    • 2012-12-31
    • 2013-01-24
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多