使用环境:VS2010 C#
出错状况:
发送端发送一串字符,显示“成功发送了38字节”;
但接收端却在Receive()函数的时候检测到了SocketException,显示“远程主机强迫关闭了一个现有的连接。”
代码如下:
发送端:
try
{
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string srvIP = "127.0.0.1";
int srvPort = 2030;
clientSock.Connect(srvIP, srvPort);
Console.WriteLine("成功连接到了对方");
string msg="hello, this is a message from client";
Byte[] sendBuf=Encoding.ASCII.GetBytes(msg);
int nSend = clientSock.Send(sendBuf);
Console.WriteLine("成功发送{0}字节", nSend);
Console.WriteLine(clientSock.Connected.ToString());
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
接收端: try
{
//表示有消息接收
int nRecv = commSock.Receive(recvBuf);
//正常处理
if (nRecv > 0)
{
Console.WriteLine("接收到{0}字节", nRecv);
string recvMsg = ASCIIEncoding.ASCII.GetString(recvBuf);
Console.WriteLine("接收到的消息为:{0}", recvMsg);
}
else
{
Console.WriteLine("对方关闭了连接,接收线程退出");
return;
}//end of else
}//end of try
catch (SocketException e)
{
Console.WriteLine(e.Message);
return;
}
原因分析: 如果发送端发送成功的话,接收端最起码应该Receive()函数之后才会捕获到异常
而且,如果是发送端关闭的话,应该nRecv<=0,应该输出“对方关闭了连接,接收线程退出”才对
后来分析了下:远程主机强迫关闭了一个现有的连接
检查了下发送端,发现确实在发送完消息之后,没有调用Socket.Close();来关闭套接字
修正之后,问题解决了
小结:
编程习惯很重要啊