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个回答

经过重装系统,重装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版本(在相同的操作系统上),然后仔细排查,万一是因为语法不兼容,或者向我这样的粗心大意导致的问题呢?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐