qq_33212322
qq_33212322
2020-12-02 17:01
采纳率: 100%
浏览 159

c#构建TCP服务器运行一段时间(几小时)程序卡死问题

我用C#编写的TCP程序,通过HSK接收远程客户端上传的数据,我在本机上通过网络调试助手发送到TCP没有问题,可以运行很长时间,但只要通过HSK(拼音首字母)接到远程客户端运行一段时间就会卡死。请问该问题如何解决。谢谢

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • waterljb
    Water Lee 2020-12-08 10:04
    已采纳

    先检查是否执行过 close,执行了还在跑,说明你代码里有东西影响了socket关闭,这个只能慢慢查了。实在不行,你检查下socket吧,同样的连接频率下,看下只执行一个字符串接收会不会卡死,如果会,那就说明你的socket写的有问题,如果不会,一段一段检查现有代码,看加了哪段后出现卡死。总之,先定位问题

    点赞 评论
  • zte1055889498
    XKIND 2020-12-02 23:03

    TCP粘包拆包 没有处理好

    点赞 评论
  • waterljb
    Water Lee 2020-12-03 17:55

    服务器端是否做了连接数据库的操作,检查连接数据库的方式是否可能造成资源不能被释放。同时也检查是否有非数据库连接的变量也可能出现进程间死锁出现。

    点赞 评论
  • qq_33212322
    qq_33212322 2020-12-03 19:14

    服务器端每秒都操作一次SQL数据库存储数据,使用的建立如下的链接

    connstr1 = "server=192.168.1.107.158;database=0000;uid=sa;pwd=wuhua123;MultipleActiveResultSets=true";

    您所说的非数据库连接的变量出现进程间死锁没太明白。奇怪的是本地发送就没有问题

    点赞 评论
  • waterljb
    Water Lee 2020-12-04 09:38

    我遇到过的情况是数据库连接的变量没有写在方法里,而是写为整个程序的变量,这样导致数据库一次打开后不停增加连接而不关闭,那么一段时间后SQL连接数就会连满,要不很慢,要不就卡死了。正确的写法要在单个方法打开数据库,在方法结束时务必关闭数据库,虽然增加了数据库开关的开销,但不会造成过多连接数。

    至于你说的在本地不会,那是因为连接的终端太少,你也可以自己写段代码,累加1万个连接看下会不会卡死。

    另外,如果你用了多线程,一定要查看是否有共用的变量,如果有,确保不会出现多个线程同时修改一个变量的情况出现,否则一但出现,线程间可能出现死锁,那也会卡死。

    当然以上两种可能,如果重启服务端程序,一般都会立恢复,但在数秒或数分种内又会重新卡死。这也是判断问题所在的一个方法。

    点赞 评论
  • qq_33212322
    qq_33212322 2020-12-04 14:43

    你说的这些,我编程的时候都注意了,现在好像发现点问题了,就是每次卡住之后我把HSK刷新下程序又都正常

    ,估计是死在那个线程里面了,刷新之后线程重启就又都正常了,但不知道线程为啥会死,而且程序中怎样处理这种情况?

     

    点赞 评论
  • waterljb
    Water Lee 2020-12-04 15:29

    如果可以定位到线程里那就一行一行的查吧,看是执行哪段时会出问题,我的做法是每执行一段代码输入出一个提示信息,在卡死时超时时,就可以定位到卡死的代码,这样再查原因。

    另外,如果你的HSK是socket服务的话,也要考虑是否及时释放了不再需要的连接,连接过多也会卡死。

    点赞 评论
  • qq_33212322
    qq_33212322 2020-12-05 09:56

    现在又出现了问题,程序卡死,界面都动不了

     

    点赞 评论
  • qq_33212322
    qq_33212322 2020-12-05 11:29

    找到TCP这个CLOSE_WAIT过多,应该是SOCKET使用完了,网上说调用close方法,我是在socket.revice()后,如果读取的数据长度为0,就socket.close();不知道方法对不?程序还在跑的。

     

     

    点赞 评论

相关推荐