while (1)
{
memset(buf, 0, 1024);
int flag = recv(sockfd, buf, 1024, 0);
//if (flag !=-1)
//buf[flag] = '\0';
CString part;
if (flag <= 0)
break;
else
{
int wcslen = ::MultiByteToWideChar(CP_UTF8, NULL, buf, flag, NULL, 0);
wchar_t* wszString = new wchar_t[wcslen + 1];
::MultiByteToWideChar(CP_UTF8, NULL, buf, flag, wszString, wcslen);
wszString[wcslen] = L'\0';
part = wszString;
all = all + part;
}
}
服務端發來的字符將近3000左右,第一次能接收到字符,第二次flag回傳值為-1,直接結束回圈,讀取的字符不全;但將buf[1024]的改為buf[3072]和recv(sockfd, buf, 1024, 0)改為recv(sockfd, buf, 3072, 0),能接收到服務端發來的全部字符。這種情況是為什么?
uj5u.com熱心網友回復:
tcp是流。像水流一樣。連續不斷。uj5u.com熱心網友回復:
1首先,你可以確認下,你回圈的次數是不是真的只有一次,你可以在else陳述句里加一個計數,確認下,真的是只讀了一次?,
如果只讀了一次,那就要考慮對端是否發送成功的問題,一般不會是這樣的問題了
~~
2else陳述句里面
part和all是什么型別string? 還是wchar_t*
如果是wchar_t* 那就是個大問題了
無法實作你想要的東西
uj5u.com熱心網友回復:
wchar_t* wszString = new wchar_t[wcslen + 1];沒有配對的 delete [] , 長時間泄露可能會導致記憶體不足
uj5u.com熱心網友回復:
位元組不會少。一次收1024位元組后立即就轉寬位元組,很可能是N個半寬字符,被截斷后是否可能出現終止符位元組,你也沒判斷MultiByteToWideChar失敗的情況,還有本身有沒有傳終止符位元組過來?自己除錯吧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/87345.html
標籤:C++ 語言
上一篇:c語言中稀疏矩陣的建立和列印
下一篇:c++設計一個日期類Date,能夠在實體化后給日期物件賦值,能夠輸出物件的日期。為Date類設計一成員函式,能夠求得兩個日期的相差天數。
