Socket通信问题,阻塞问题,请各位大神帮忙分析下

程序yy 2019-04-17 07:52:36
与硬件设备进行通信,采用多线程的方式 。正常通信没问题。
但当通信失败或设备关闭后,再重新连接后,发送给设备的指令设备不执行,同时也收不到设备的反馈信息。但把程序关闭后,设备会收到刚才阻塞的那条消息。

核心代码如下:
   _tcpPro.WriteData(code);
string nextcmd = "";
if (cmd.nextCarCommand != null)
{
nextcmd = cmd.nextCarCommand.getCode();
}

string lastback = "";
string t_cmmback = _tcpPro.ReadData(Constants.backlength, Constants.DefaultBack);
while (!t_cmmback.Contains(Constants.DefaultBack))
{
//读取的内容很少的情况下 ,可能是网络因素造成的,这时候再进行一次拼接 。
lastback = t_cmmback;
t_cmmback = _tcpPro.ReadData(Constants.backlength, Constants.DefaultBack);
}


断点跟踪,可以看到陷入了While死循环,也就是没有收到返回数据。但上面的WriteData方法其实已经执行过了 。

ReadData中的代码如下:
 {
//_networkStream.ReadTimeout = 240000;
if (_tcpClient != null && _networkStream != null)

{

string first = "";
string second = "";
int trycount = 0;
while ((first != "A0") || (second != "B0"))
{
if (!_networkStream.DataAvailable)
{
trycount++;
if (trycount > 20)
{
return _readBuffer;
}
Thread.Sleep(10);
continue;


}


跟踪代码,发现程序一直在循环 if (!_networkStream.DataAvailable) 尝试20次后,返回空,返回到上面的While里
然后再重复读取 。一直跳不出来。这时候关闭程序,发现设备才接收到刚才的指令。但程序已关闭,后续无法交互了。
...全文
268 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序yy 2019-04-19
  • 打赏
  • 举报
回复
解决了,原来是断开的时候没有关闭连接 。再连接的时候重新new了新的连接 ,就会导致新的连接发不出数据 。
jx315425246 2019-04-18
  • 打赏
  • 举报
回复
写入了数据缓冲区,但不一定发送,
引用

IAsyncResult ar = _networkStream.BeginWrite(data, 0, data.Length, null, null);
if (!ar.AsyncWaitHandle.WaitOne())
{

ExceptionBase eb = new ExceptionBase(ExceptionLevel.Error, "车辆编号:" + _tcpClientOBJ.AgvID + "写入数据异常:!ar.AsyncWaitHandle.WaitOne()");
ExceptionManager.DoException(eb);
//未发送成功,处理客户端的连接,重新Connect
}
_networkStream.EndWrite(ar);
程序yy 2019-04-18
  • 打赏
  • 举报
回复
引用 4 楼 stherix 的回复:
你发送完数据然后不等回应直接往下走,不读取数据 看设备能收到命令不
试过了 ,不等回应 直接写了发送代码 ,再读取还是读不出来 ,也发不出去。只有关了程序 才把这条发出去了。
  • 打赏
  • 举报
回复
通讯程序的异步操作模式,没有荒唐透顶的 Sleep 语句,也不会看到什么 While 控制。
大鱼> 2019-04-18
  • 打赏
  • 举报
回复
各执一词,不好分析
jx315425246 2019-04-18
  • 打赏
  • 举报
回复
网络连接怎么写的?
wanghui0380 2019-04-18
  • 打赏
  • 举报
回复
把看不见的变成看的见的,不然双方各执一词,很难办 请下载“封包截获工具”,直接看双方封包
stherix 2019-04-18
  • 打赏
  • 举报
回复
你发送完数据然后不等回应直接往下走,不读取数据 看设备能收到命令不
程序yy 2019-04-18
  • 打赏
  • 举报
回复
看现象确实没发送,并且一直发不出去。只有关闭程序后,硬件设备才收到了这个发送信息 。这个怎么解决?
程序yy 2019-04-17
  • 打赏
  • 举报
回复
对了,写数据的代码如下:
public void WriteData(byte[] data)
        {
            
            try
            {
                if (_tcpClient != null && _networkStream != null)
                {
                    //_networkStream.BeginWrite()
                    //  _networkStream.Write(data, 0, data.Length);

                    IAsyncResult ar = _networkStream.BeginWrite(data, 0, data.Length, null, null);
                    if (!ar.AsyncWaitHandle.WaitOne())
                    {

                        ExceptionBase eb = new ExceptionBase(ExceptionLevel.Error, "车辆编号:" + _tcpClientOBJ.AgvID + "写入数据异常:!ar.AsyncWaitHandle.WaitOne()");
                        ExceptionManager.DoException(eb);
                    }
                    _networkStream.EndWrite(ar);
                }
            }
            catch (Exception ex)
            {

                throw new Exception(_tcpClientOBJ.AgvID, ex);
            }
        }
不知道是不是ar.AsyncWaitHandle.WaitOne())的影响 。但这个方法实际已经结束。

110,538

社区成员

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

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

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