第一次执行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 所在的线程会被阻塞住。也就是你说的卡住。