Socket 远程主机强迫关闭了一个现有的连接

superfrank0711 2014-10-16 11:09:54
多线程 通过Socket调用远程接口,在客户端socket.Receive的时候catch到异常:"远程主机强迫关闭了一个现有的连接";
服务器端接口方,确定说是那边没问题,我这边客户端也没排查出什么原因,部分调用Socket的代码如下,请教解答,

public static string SendSocketFullAutoTicketInfo(string sendContentText, string hashKey)
{
string stringData = "";
Socket socket = null; ;
string qString = "";
string ipAndPort = "";
try
{
qString = "请求开始时间:" + DateTime.Now + " 请求内容" + sendContentText;
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] byteMessage;
if (!socket.Connected)
{
ipAndPort = SelectServerIp(hashKey);///获取服务器IP好端口

IPAddress serverIp = IPAddress.Parse(ipAndPort.Split(':')[0]);
int serverPort = Convert.ToInt32(ipAndPort.Split(':')[1]);
IPEndPoint iep = new IPEndPoint(serverIp, serverPort);
socket.Connect(iep);
}

byteMessage = Encoding.ASCII.GetBytes(sendContentText);
socket.Send(byteMessage);
byteMessage = new byte[20480];
int resv = socket.Receive(byteMessage);
stringData = Encoding.GetEncoding("GBK").GetString(byteMessage, 0, resv);

qString += " 服务器:" + ipAndPort + "; 请求返回时间:" + DateTime.Now + "; 请求返回内容:" + stringData;
}
catch (Exception ex)
{
stringData = "服务器无响应--请检查服务器";
qString += " 服务器:" + ipAndPort + "; 请求返回时间:" + DateTime.Now + "; 请求返回内容:" + stringData;
LogHelp.LogException("服务器无响应--请检查服务器", qString, ex, FullAutoTicketConfig.InnerMonitorMailList);
throw ex;

}
finally
{
if (socket != null && socket.Connected)
{
try
{
//socket.Disconnect(false);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = null;
}
catch (Exception closeEx)
{
LogHelper.WriteLog("异常", string.Format("Request_Response11_{0}.txt", DateTime.Now.ToString("yyyyMMddHH")), closeEx.Message);
}
}
}
return stringData;
}
...全文
3322 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
superfrank0711 2014-10-17
  • 打赏
  • 举报
回复
感谢p哥、Z65443344、jy251同学的帮助,我这边会进一步和服务端交涉,让他们配合查下问题,谢谢!
於黾 2014-10-17
  • 打赏
  • 举报
回复
我自己随手做的server端,会先校验请求是否合法,不合法会回发相应的异常信息 即使有些奇葩数据格式没有考虑周到,顶多就是计算返回值的时候走到catch里去,不给客户端返回数据 从来也不主动关闭连接 目测你们server端,catch里没有验证错误类型,只要走到catch就认为是客户端断开连接了,然后server端也断开连接
  • 打赏
  • 举报
回复
“一问一答”的短连接,如果服务器端发现得到的请求信令有错,应该返回约定的异常信息。 如果服务器直接断掉了连接,还告诉你“确定说是那边没问题”,那就是奇葩,太明显了。
  • 打赏
  • 举报
回复
你也可以了解一下,如果服务器端同时保持1000一个连接,那么你或许可以相信服务器端。如果不是,如果服务器端很少有连接,那么我想这个服务器端开发商可能经验不足、品质不太好。
  • 打赏
  • 举报
回复
引用 4 楼 SuperAugus 的回复:
偶尔失败,因为我请求的数据比较多一天有200-300的样子,接收成功的还是大多数!
每分钟200也不算多,何况一天?! 如果不是网络中断,而是服务器中断,你可以跟对方说:“任何情况下也不应该主动断掉服务器端连接啊”。 如果对方主动断掉连接,而查不出理由,那至少说明服务器端流程有错误。先要求对方搞清楚这个逻辑,你们再说查别的问题吧。
jy251 2014-10-17
  • 打赏
  • 举报
回复
多半是你这边发多了,而server那边的代码写的不怎么强大,server的某个socket线程出异常了,server的socket关闭了,你这里就报错了
superfrank0711 2014-10-16
  • 打赏
  • 举报
回复
回复6楼: 这个是允许的,而且其他的客户端他们说是没问题的, 但是我们这边大部分情况下是没问题的! 双方也说不清楚!
superfrank0711 2014-10-16
  • 打赏
  • 举报
回复
回复7楼: 可以借鉴此方式排查问题,谢谢!
xian_wwq 2014-10-16
  • 打赏
  • 举报
回复
网络通讯监测通讯超时、中断重连等异常情况都需要重点处理 否则在局域网可以运行的软件, 放到公网或者链路质量较差的环境下就可能用不了了
xian_wwq 2014-10-16
  • 打赏
  • 举报
回复
为了便于定位问题,可以先把server端的处理逻辑简化, 即接收请求后立即返回简单数据。 看是不是因为同步通讯的问题。 如果server端简化后,问题排除,那就需要改造server端了。 如果简化后,问题仍然存在。 那就重点关注client这侧的问题。 把同步通讯改为异步再试试
於黾 2014-10-16
  • 打赏
  • 举报
回复
服务端不是你自己做的,很难说到底什么问题 你先联系一下他们,确定他们的服务端允许同一个IP的多个端口去访问?
superfrank0711 2014-10-16
  • 打赏
  • 举报
回复
200-----300个请求接收不到数据,抛出刚刚异常!
superfrank0711 2014-10-16
  • 打赏
  • 举报
回复
偶尔失败,因为我请求的数据比较多一天有200-300的样子,接收成功的还是大多数!
於黾 2014-10-16
  • 打赏
  • 举报
回复
是偶尔失败,还是一直就没收到过??
superfrank0711 2014-10-16
  • 打赏
  • 举报
回复
网络中断的概率是极低的,但是这边复现很多的,不太可能是网络问题!谢谢!
rayyu1989 2014-10-16
  • 打赏
  • 举报
回复
网络中断也有可能的,是否必现?

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧