最好的方法是首先以固定格式发送字符串数据的长度(例如,以网络字节序的uint32_t
),然后接收方可以先读取此长度并分配适当大小的缓冲区,在接收后续发送的序列化消息。
假设sd
和csd
已经存在套接字描述符。
Sender.cpp
std::string dataToSend = "Hello World! This is a string of any length ...";
uint32_t dataLength = htonl(dataToSend.size()); // Ensure network byte order
// when sending the data length
send(sd,&dataLength ,sizeof(uint32_t) ,MSG_CONFIRM); // Send the data length
send(sd,dataToSend.c_str(),dataToSend.size(),MSG_CONFIRM); // Send the string
// data
接收器.cpp
uint32_t dataLength;
recv(csd,&rcvDataLength,sizeof(uint32_t),0);
dataLength = ntohl(dataLength );
std::vector<uint8_t> rcvBuf;
rcvBuf.resize(dataLength,0x00);
recv(csd,&(rcvBuf[0]),dataLength,0);
std::string receivedString;
receivedString.assign(&(rcvBuf[0]),rcvBuf.size());
优点是,你不必处理多个缓冲区读取和复制到接收字符串中的问题。此外,当发送的数据最终完成时,接收方将知道。
缺点是,在发送长度之前,你正在引入一种“协议”。
star pkt;
是什么意思?它适用于std::string吗?如果您能写一段代码,我将不胜感激。否则我会自己尝试。 - Cattystar pkt;
是一个 protobuf 生成的类的对象实例。它可以从/序列化为std::string
对象。这些对象用于通过套接字发送/接收,并展示您的需求。 - πάντα ῥεῖ