第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

通過(guò) TCP 套接字發(fā)送大型 Base64 字符串

通過(guò) TCP 套接字發(fā)送大型 Base64 字符串

Go
蝴蝶刀刀 2023-07-31 15:35:18
我正在嘗試使用 C++ 中的 GO 和 TCP 服務(wù)器從 TCP 客戶(hù)端發(fā)送 Base64 編碼的圖像。這是 C++ 接收器的代碼片段std::string recieve(int bufferSize=1024,const char *eom_flag = "<EOF>"){char buffer[bufferSize];std::string output;int iResult;char *eom;do{    iResult = recv(client, buffer, sizeof(buffer), 0);    //If End OF MESSAGE flag is found.    eom = strstr(buffer,eom_flag);    //If socket is waiting , do dot append the json, keep on waiting.    if(iResult == 0){        continue;    }    output+=buffer;    //Erase null character, if exist.    output.erase(std::find(output.begin(), output.end(), '\0'), output.end());        //is socket connection is broken or end of message is reached.}while(iResult > -1 and eom == NULL);//Trim <EOF>std::size_t eom_pos = output.rfind(eom_flag);return output.substr(0,eom_pos);}想法是接收消息直到找到消息結(jié)束,然后繼續(xù)偵聽(tīng)同一 TCP 連接上的另一個(gè)消息。Golang TCP 客戶(hù)端代碼片段。//Making connectionconnection, _ := net.Dial("tcp", "localhost"+":"+PortNumber)if _, err := fmt.Fprintf(connection, B64img+"<EOF>"); err != nil {            log.Println(err)            panic(err)        }嘗試過(guò)的方法:增加 C++ 接收器中的緩沖區(qū)大小。從 C++ 接收器中的字符串末尾刪除空字符。觀察結(jié)果:客戶(hù)端發(fā)送的字符串長(zhǎng)度是固定的,而接收函數(shù)后的字符串長(zhǎng)度較大且隨機(jī)。示例:Go 客戶(hù)端字符串長(zhǎng)度為 25243。對(duì)于同一個(gè)字符串,當(dāng)我在循環(huán)中運(yùn)行發(fā)送和接收時(shí)接收后的長(zhǎng)度為 25243、26743、53092、41389、42849。將接收到的字符串保存在文件中時(shí),我在字符串中看到 <0x7f> <0x02> 字符。我正在使用winsock2.h 作為c++ 套接字。
查看完整描述

1 回答

?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

您將接收到的數(shù)據(jù)視為 C 字符串(以 0 字節(jié)結(jié)尾的字節(jié)序列),這是不正確的。

recv接收一些字節(jié)并將它們放入buffer. 假設(shè)它收到了 200 字節(jié)。

那么你就這樣做strstr(buffer,eom_flag);。strstr不知道已收到 200 字節(jié)。strstr從緩沖區(qū)的開(kāi)頭開(kāi)始,一直查找,直到找到 、 或 0 字節(jié)。即使您沒(méi)有收到,它也有可能在緩沖區(qū)的其他 824 字節(jié)中找到 a。

那你就做吧output += buffer;。這也將緩沖區(qū)視為以 0 字節(jié)結(jié)尾。這將查看整個(gè)緩沖區(qū)(不僅僅是前 200 個(gè)字節(jié))以查找 0 字節(jié)。然后它將把截至該點(diǎn)的所有內(nèi)容添加到output. 同樣,它可能會(huì)在緩沖區(qū)的最后 824 字節(jié)中找到 0 字節(jié),并添加過(guò)多的數(shù)據(jù)。它可能根本在緩沖區(qū)中找不到 0 字節(jié),然后它將繼續(xù)從存儲(chǔ)在buffer內(nèi)存中的其他變量中添加額外的數(shù)據(jù)?;蛘咚赡軙?huì)在前 200 個(gè)字節(jié)中找到 0 字節(jié),并在那里停止(但前提是您發(fā)送了 0 字節(jié))。


您應(yīng)該做的是注意接收到的字節(jié)數(shù)(即iResult)并將這些字節(jié)添加到輸出中。你可以使用:

output.insert(output.end(), buffer, buffer+iResult);

另外(正如 Phillipe Thomassigny 在評(píng)論中指出的那樣),“”可能不會(huì)立即全部收到。您可能會(huì)單獨(dú)收到“”。您應(yīng)該檢查是否output有“”,而不是檢查是否buffer有“”。(這對(duì)性能的影響留給讀者作為練習(xí))


順便說(shuō)一下,這一行目前沒(méi)有做任何事情:

output.erase(std::find(output.begin(), output.end(), '\0'), output.end());

因?yàn)?'\0' 永遠(yuǎn)不會(huì)被添加到output,因?yàn)閷?duì)于output += buffer;,'\0' 告訴它在哪里停止添加。


查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 210 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)