gpt4 book ai didi

c++ - Visual C++ 19.10.25019 – C++ 编译器错误?

转载 作者:行者123 更新时间:2023-11-28 05:04:31 25 4
gpt4 key购买 nike

我有一个通过 TCP 接收可变长度消息的函数。发送函数创建一个缓冲区,将消息的长度放在前四个字节中,用消息填充其余部分,然后分段发送。但是接收函数少接收了 4 个字节。突然间,当我输入一个 printf 时,一切正常。

bool TCP_Server::recvMsg(SOCKET client_sock, std::unique_ptr<char[]>& buf_ptr, int* buf_len)
{
int msg_len;
int rcvd = 0, tmp;////
/* get msg len */
if((tmp = recv(client_sock, (char*)&msg_len, sizeof(msg_len), 0)) == -1)
{
handle_error("recv");
return false;
}
*buf_len = msg_len;
printf("msg_len = %d\n", msg_len); //

printf("tmp getting msg_len = %d\n", tmp);//
rcvd += tmp;//

buf_ptr.reset((char*)malloc(msg_len));
if(buf_ptr.get() == nullptr) // not enough memory
{
handle_error("malloc");
return false;
}

/* get msg of specified len */

/* get by biggest available pieces */
int i = 1;
while(int(msg_len - 1440 * i) > 0)
{
char* cur_ptr = buf_ptr.get() + 1440 * (i - 1);

if((tmp=recv(client_sock, cur_ptr, 1440, 0)) == -1)
{
handle_error("recv");
return false;
}
printf("1440 = %d\n", tmp); // doesn't work if I comment this line
rcvd += tmp;
i++;
}
int rest = msg_len - 1440 * (i - 1);

/* get the rest */
if((tmp = recv(client_sock, buf_ptr.get() + msg_len - rest, rest, 0)) == -1)
{
handle_error("(recv)reading with msg_len");
return false;
}
rcvd += tmp;//
printf("rcvd = %d\n", rcvd);//
return true;
}

总而言之,如果我注释 printf("1440 = %d\n", tmp);,该函数将少接收 4 个字节。

我正在使用 x86 调试进行编译。

这是 asm(/FA 标志)中不同的行:http://text-share.com/view/50743a5e但我没有看到任何可疑的东西

最佳答案

printf 写入控制台,相对而言,这是一个相当慢的操作。当您调用 recv 时,它产生的额外延迟可能很容易改变到达缓冲区的数据量。

正如 Tulon 评论的那样,从 TCP 流中读取可以是任意长度。 TCP 不保留消息边界,因此它们不一定与另一端的发送大小相匹配。如果通过网络发送的数据少于您要求阅读的数据,您将获得可用的数据。

解决方案:停止考虑 1440 字节的 block 。摆脱 i 并简单地将 rcvdmsg_len 进行比较。

关于c++ - Visual C++ 19.10.25019 – C++ 编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45146093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com