[英]Visual C++ 19.10.25019 – C++ compiler bug?
我有一個通過TCP接收長度可變的消息的功能。 send函數創建一個緩沖區,將消息的長度放在前四個字節中,用消息填充其余部分,然后按部分發送。 但是接收功能少接收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字節的塊。 擺脫i
並簡單地將rcvd
與msg_len
進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.