我正在尝试使用 C++ 中的 GO 和 TCP 服务器从 TCP 客户端发送 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);}
想法是接收消息直到找到消息结束,然后继续侦听同一 TCP 连接上的另一个消息。
Golang TCP 客户端代码片段。
//Making connection
connection, _ := net.Dial("tcp", "localhost"+":"+PortNumber)
if _, err := fmt.Fprintf(connection, B64img+"<EOF>"); err != nil {
log.Println(err)
panic(err)
}
尝试过的方法:
增加 C++ 接收器中的缓冲区大小。
从 C++ 接收器中的字符串末尾删除空字符。
观察结果:
客户端发送的字符串长度是固定的,而接收函数后的字符串长度较大且随机。示例:Go 客户端字符串长度为 25243。对于同一个字符串,当我在循环中运行发送和接收时接收后的长度为 25243、26743、53092、41389、42849。
将接收到的字符串保存在文件中时,我在字符串中看到 <0x7f> <0x02> 字符。
我正在使用winsock2.h 作为c++ 套接字。
撒科打诨
相关分类