gpt4 book ai didi

c++ - boost::asio与标准C socket接口(interface)的配合

转载 作者:搜寻专家 更新时间:2023-10-31 01:56:55 25 4
gpt4 key购买 nike

我目前正在做一个小项目:有一个通过标准 C 接口(interface)实现的 UDP 发送一些字符串的协议(protocol)。

虽然它工作得很好,但我想用一些更复杂的 C++ 重写它(考虑练习)。

目前是这样的:客户端需要那个字符串,所以它发送以下 struct:

struct request {
uint8_t msg_type;// == 1
uint64_t key; // generated randomly to identify each request
}

在新的实现中,我想使用 boost::asio 所以在服务器中我有以下代码:

boost::asio::io_service io_service;
boost::asio::ip::udp::endpoint client_endpoint;
boost::asio::ip::udp::socket socket(io_service,
boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(),
m_serverPort));
boost::asio::streambuf sb;
boost::asio::streambuf::mutable_buffers_type mutableBuf =
sb.prepare(sizeof(request));
size_t received_bytes = socket.receive_from(mutableBuf, client_endpoint);
sb.commit(received_bytes);

request r;
std::istream is(&sb);
is >> msg_type;
is >> key;
key = __bswap64(key); // I'm using network byteorder for numbers sent with this protocol
// and there's no ntohll function on Snow Leopard (at least I can't
// find one)
sb.consume(received_bytes);

这是我的问题:我尝试以这种方式接收的“关键”值是错误的 - 我的意思是我收到了一些我没有发送的东西。

这是我的怀疑:

  1. __bswap64 不会将网络字节序转换为主机字节序(小端字节序)
  2. 我误解了如何将 boost::asio::streambuf 与流一起使用
  3. 旧的 C 接口(interface)和 boost 之间有些不兼容(但我不这么认为因为我发现 boost 函数只是它的包装器)

编辑:嗯,他们说“在你克服之前不要赞美福特”。现在我在我的代码的另一个地方有一个非常相似的问题。我有一个以下结构,作为对上述请求的回复发送:

struct __attribute__ ((packed)) CITE_MSG_T
{
uint8_t msg_id;
uint64_t key; // must be the same as in request
uint16_t index; // part number
uint16_t parts; // number of all parts
CITE_PART_T text; // message being sent
};

//where CITE_PART_T is:
struct __attribute__ ((packed)) CITE_PART_T
{
uint16_t data_length;
char* data;
};

和以下代码:http://pastebin.com/eTzq6AWQ .不幸的是,它还有另一个错误,我又读到了一些我没有发送的东西——replyMsg.parts 和 replyMsg.index 总是 0,尽管旧的实现说它们是例如 3 和 10。这次有什么问题?如您所见,我负责填充,我使用 read 而不是 operator>>。如果你想知道我为什么一个字段一个字段地读取那个结构,这里有一个答案:服务器发送两个不同的结构,都以 msg_id 开头,一个成功,另一个失败。现在,我根本不知道如何用其他方式做到这一点。

最佳答案

您正在使用格式化输入,就像发送的数据是文本数据一样——您需要格式化输入。了解 std::istream::read成员函数,因为它是您应该使用的而不是 operator>>

请注意,如果您在每次提取后检查流状态,这将立即显而易见,因为在非一次性代码中总是应该这样做。

关于c++ - boost::asio与标准C socket接口(interface)的配合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6350833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com