Stay_Deep 2022-05-27 17:15 采纳率: 50%
浏览 116
已结题

TCP:客户端执行receive/poll卡住

问题遇到的现象和发生背景

使用TCP协议,服务端和客户端能够稳定通信,但是服务端和客户端中一个插件进行TCP进行通信就会有问题,通过测试插件中的send函数没有异常能发送,但是执行receive()函数程序就会卡在那里,执行if (TcpClient.Poll(-1, SelectMode.SelectRead))也会卡在当前位置,不知道什么原因。

问题相关代码,请勿粘贴截图
 Debug.WriteLine("Timer");
                    CheckServer(null);
                    Debug.WriteLine("CheckServer");
                    try
                    {
                        Debug.WriteLine("CheckServer 11111");
                        try
                        {
                            if(TcpClientEx.IsOnline(TcpClient))
                            {
                                Debug.WriteLine("Test");
                                if (TcpClient.Poll(-1, SelectMode.SelectRead))
                                {
                                    //int numbers = TcpClient.Receive(Buffer, 4, 0);
                                    //Debug.WriteLine(numbers);
                                    Debug.WriteLine("CheckServer 22222");      //打印不出来
                                }
                            }
                            else
                            {
                                Debug.WriteLine("BBBBBBBBBBBB");  //打印不出来
                            }


                            //ReadServertDataEx(0);
                            Debug.WriteLine(" ReadServertDataEx(0);");   //打印不出来
                        }
                        catch(ObjectDisposedException aa)
                        {
                            Debug.WriteLine(aa);
                        }
                    }
                    catch(Exception ex)
                    {
                        Debug.WriteLine("Erro Receive");
                        Debug.WriteLine(ex);
                    }
                    Debug.WriteLine("CCCCCCCCCCCC");   //打印不出来

运行结果及报错内容

Plugin Invoked
InitializeClient()
127.0.0.1
7654
Plugin Connected!
Timer
Send Ping!
4
Send2
39
CheckServer
CheckServer 11111
Test
线程 0x4570 已退出,返回值为 0 (0x0)。
线程 0x443c 已退出,返回值为 0 (0x0)。
线程 0x35c8 已退出,返回值为 0 (0x0)。
Send Ping!
4
Send2
39
线程 0x1fc8 已退出,返回值为 0 (0x0)。
线程 0x59d4 已退出,返回值为 0 (0x0)。
线程 0x51c0 已退出,返回值为 0 (0x0)。
Send Ping!
4
Send2
39

我的解答思路和尝试过的方法

现在不知道问题到底在哪?

我想要达到的结果

如何让客户端中的插件也能正常接收数据

  • 写回答

2条回答 默认 最新

  • 冰山76 2022-05-30 10:00
    关注
    获得2.50元问题酬金

    if (TcpClient.Poll(-1, SelectMode.SelectRead))很明显这一句没有返回值,也就是说TcpClient.Poll(-1, SelectMode.SelectRead)表达式没有执行完毕
    根据函数说明将poll的第一个参数改为负数,那么程序运行到此处一定会阻塞,直到有可读的内容,或者连接断开。
    说明没有新数据,在阻塞状态,因为函数阻塞,所以没有返回值,因此过一定的时间会断开链接,导致异常退出,
    如果要测试一定要在断开链接前,服务器发送测试数据,看看能否接收到

    评论

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 创建了问题 5月27日

悬赏问题

  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)