首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

第一回执行socket.Receive()的耗时很长,什么原因?(帮忙看一下程序)

2014-05-27 
第一次执行socket.Receive()的耗时很长,什么原因?(帮忙看一下程序)下面这一段程序,是客户端和服务端通信的

第一次执行socket.Receive()的耗时很长,什么原因?(帮忙看一下程序)
下面这一段程序,是客户端和服务端通信的一个主方法。

服务端暂时部署在本机。

在主机运行此程序,速度很快,几乎没有延时。但是,在其它电脑上运行的时候,速度就很慢。

经过断点调试,发现卡在

iRcv = socket.Receive(buf);

这一行代码上。

因为该几次在while循环里面,如果数据量大,是需要多次执行的,但只有第一次的时候耗时很长。

试着每buffer的包改成100字节,也没有用。

为什么?



        /*
         * 
         * 通信主程序:发送和接收
         * 
         */
        private string SendRecieve(string strToSend)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress myIP = IPAddress.Parse(strAppServerIP);
            IPEndPoint EPhost = new IPEndPoint(myIP, iAppServerPort);
            try
            {
                socket.Connect(EPhost);
            }
            catch (SocketException e)
            {
                return "ERR" + e.Message;
            }
            socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 50000);//50秒超时


            byte[] sendBytes = System.Text.Encoding.Default.GetBytes(strToSend + "\rbye\r");
            socket.Send(sendBytes, sendBytes.Length, SocketFlags.None);


            //接收数据
            string strResult = string.Empty;
            byte[] buf = new byte[1024];
            //byte[] buf = new byte[100];

            int iRcv = 0;
            while (true)
            {
                try
                {
                    iRcv = socket.Receive(buf);
                }
                catch (SocketException)
                {
                    socket.Close();
                    return "ERR连接超时!";
                }
                if (iRcv == 0)
                {
                    break;
                }
                byte[] buf2 = new byte[iRcv];
                for (int i = 0; i < iRcv; i++)
                {
                    buf2[i] = buf[i];
                }
                strResult = strResult + System.Text.Encoding.Default.GetString(buf2);
            }
            /////////


            socket.Close();


            return strResult;
        }


[解决办法]
receive 是阻塞函数,如果对方没有发送任何数据, receive 所在的线程会被阻塞住。也就是你说的卡住。

热点排行