socket 客户端发送成功,服务端没有接收到也没报错

doudingchenlei 2018-01-31 10:47:41
private static bool SendString(string strMessage, ref string rsp)
{
bool result = false;
Socket c = null;
int sendBytes = 0;
try
{
string host = _desthost;
int port = _destport;
IPAddress ip = IPAddress.Parse(host);

IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
c.ReceiveTimeout = 30000;
c.Connect(ipe);//连接到服务器

byte[] bs = Encoding.Default.GetBytes(strMessage);
sendBytes = c.Send(bs, bs.Length, 0);//发送信息
WriteLog("SEND=" + strMessage);

byte[] recvBytes = new byte[1024];
c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
rsp = Encoding.Default.GetString(recvBytes, 0, recvBytes.Length).TrimEnd('\0');

WriteLog("RECV=" + rsp);

c.Close();
result = true;
}
catch (Exception ex)
{
rsp = ex.Message;

result = false;
WriteSysLog(ex.Message + "\r\n[data=" + strMessage + "]");
}
finally
{
if(c != null)
c.Close();
}
return result;
}


以上是客户端代码。服务端是另一个公司开发的,我无法获得。
四台机器,每台机器上都装了一个客户端和一个服务端,通讯IP设的是127.0.0.1,端口是约定好的。每天早上开开进行通讯,晚上九点结束,关闭客户端和服务端,关机。每隔两三天左右会出现一次,四台机器同时出现通讯失败,客户端这边能看到发送成功的日志,过了30秒之后抛出了异常 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 服务端那边没收到消息,也没有抛异常。Telnet相应端口,黑框框正常弹出。重启客户端,仍然是send成功,receive抛异常,再重启服务端后,恢复正常通讯。整个异常期间服务端没有抛错,也没有接收到数据。

此帖以前发过,没有解决,现在问题仍然存在,昨天通讯失败的时候发现端口占用情况中,多了一个ESTABLISHED的连接。图片如下。网上查到ESTABLISHED状态下,只要客户端发送close,就会结束这个连接。但是客户端的代码里,每个路径都做了close了。是否还是服务端的问题呢??
...全文
2436 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmyouren1983 2018-02-02
  • 打赏
  • 举报
回复
使用网络抓包工具分析,是谁主动断开了连接。IpTool wireshark
  • 打赏
  • 举报
回复
让他们自己写个客户端测试看看吧,不要总怀疑自己的问题,多找找别人的原因
doudingchenlei 2018-02-02
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
下载你可以试下只重启服务端,客户端不重启看看

只重启服务端,不重启客户端,可以恢复正常通讯。但是目前服务端的开发人员找不到他们的问题。。。我这边也找不到我们的问题。
我把客户端改成长连接,不主动关闭socket连接。只有在catch出异常的时候再重连socket。

在一个客户现场A处测试没有发生通讯失败,但是放到另一个客户现场B处就每次socket只能成功一次,必须进行重连。无法正常使用。左图是B处一次正常通讯后的状态,右图A处是可正常多次通讯的状态


  • 打赏
  • 举报
回复
或者可以考虑多几个端口供监听
  • 打赏
  • 举报
回复
下载你可以试下只重启服务端,客户端不重启看看
  • 打赏
  • 举报
回复
不过ESTABLISHED状态是没被释放,所以端口还是被占用状态,这应该是服务端没释放
doudingchenlei 2018-01-31
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
看你描述没问题啊,就是网络问题,tcp握手不成功 估计是对方服务端端口被占用了吧?
11428是我们约定的端口。那张图上的,第一个通讯异常的图,比后面两张正常的多了一对端口是11428ESTABLISHED的连接. 如果是网络原因,为何每次一重启客户端和服务端就好了呢? 通讯异常时,查看了11428端口,确实是被server程序给占用的。Telnet也是通的,所以应该也不是端口问题 吧
  • 打赏
  • 举报
回复
看你描述没问题啊,就是网络问题,tcp握手不成功 估计是对方服务端端口被占用了吧?

110,535

社区成员

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

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

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