°默然 2019-04-28 18:37 采纳率: 50%
浏览 347
已采纳

VS2017+WIN10,程序运行过程中,返回值正确,但是依然会进入错误处理代码块中,求解?

之前一直在win7平台做开发,因为项目需要,把代码转到win10上运行,发现有错误.
于是自己装了一台win10在本地调试代码,发现一个奇怪的问题.

代码如下:

for (size_t i = 0; i < n重连次数; i++)
{
Sleep(1000);

    LONG retSend = Send(sock, &bufInfo);
    if (retSend <= 0)
    {
        g_Client.Connect(g_strIP, g_nPort);
        sock = g_Client.m_Socket;
        continue;
    }
    break;

}

  就是这么简单的一段代码,在win7平台调试和生成运行都没有问题,但是放在win10就出问题.
 返回值 retSend 接收的是发送数据的长度.
  我在win10环境下 下个断点,断点位置在LONG retSend = Send(sock, &bufInfo);这段代码处,
  发现当Send函数执行完毕后,retSend接收的结果依然是0,(哪怕数据发送成功,并且长度是100,并且正确返回,但是retSend在断点位置,以及断点F10向下走下一条,依然是0)
接着断点走入  if (retSend <= 0) 代码块里面,
奇怪的现象出现了,如果说retSend的结果是0,那么继续向下走,也就罢了,
最关键的是,它在这里突然又变成了正确的值,比如retSend=100了.
程序本来在这个代码块中运行这,结果没有走到结尾,突然就又跳了回去
也就是说直接走到break;这里,跳出循环了.
这个问题困扰我两天了,在这里跪求大神解答.
这段代码在win7环境下测试几年都没有问题的,但是在win10就是不行,不知道是编译器原因还是win10做了某些优化
    Send(sock, &bufInfo);此函数是自己封装的发包函数,里面有一些数据压缩加密,然后就是调用send将数据发送出去.
    在Send()里面,返回值是正确的,但是在这段代码中,retSend接收到的结果却没有即时被复制,直到进入错误处理代码块中突然变好又跳了出去.
    如果没有下调试断点,那么它就不会break,一直在错误处理代码中循环完毕才结束.
  • 写回答

2条回答 默认 最新

  • °默然 2019-04-29 03:44
    关注

    经过重装系统,重装VSIDE等各种操作,终于找到问题的症结所在了
    其实VS2017+WIN10 以及VS2019
    因为都用了c++14规范,而且VS2017等IDE中,微软有SDL检查机制,强制程序员使用最新最规范和最安全的代码写法。
    我因为用旧的操作系统(winXP-win7等)时间太久,而且也一直使用的是VS2008(今年才转用VS2017)
    旧的代码在新的IDE中编译很难通过,所以一直都是将SDL关闭了。
    今天下午我重装了几遍VS2015+WIN10,就是为了避免它这个最新C++规范和SDL
    发现IDE降级后,果然没有了断点乱跳的现象,可能是新IDE依然有各种不明白的优化设置原因吧,所以才会断点乱跳。
    能够正常断下调试之后,最后找到了错误原因:
    在connect后,我设置的发送接收超时,参数错误。
    LONG ClientSock::SetSocketTimeOut(SOCKET socket, int n发送超时,int n接收超时)
    {
    int ret1 = setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO,(CHAR*)&n发送超时, sizeof(n发送超时));

    int ret2 = setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (CHAR*)&n接收超时, sizeof(n接收超时));
     if (ret1 == SOCKET_ERROR || ret2 == SOCKET_ERROR)
         return 0;
     return 1;
    

    }

    n发送超时 和 n接收超时 应该都是以毫秒为单位,也就是说应该传入的是1000(等于一秒),我传入的是1(超时时间设置的是一毫秒);
    就这么一个粗心大意的错误,在win7以及XP上 竟然运行了几年都没出过太大的问题,我也是佩服自己。
    但是在win10上面,或许系统优化的过分优秀,瞬间就超时返回了,所以接收到的结果也就出现那种奇葩现象了!

    在此没有要感谢的人,要感谢的话就感谢我自己吧,累了两天多,终于解决这个问题,还是有点小欣慰了的。

    同时也结帖,表示这个问题没人给出有用的答案,表示遗憾。
    如果你有幸遇到同样的问题,不妨也试试降低IDE版本(在相同的操作系统上),然后仔细排查,万一是因为语法不兼容,或者向我这样的粗心大意导致的问题呢?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料