Gần đây tôi đã quyết định sử dụng boost::asio
cho ổ cắm của mình, nhưng hiện tại tôi đang gặp sự cố: tài liệu dường như thiếu.Gửi dữ liệu thô với write() trong boost :: asio
Những gì tôi muốn làm là viết một hàm mà sẽ gửi một thông điệp bao gồm cấu trúc sau:
- 2 byte của một số nguyên unsigned (
uint16_t
) cho một opcode tất cả các byte - tất cả các byte sau rằng (một số tiền linh hoạt) là bất kỳ loại dữ liệu nào (được đúc thành
void*
). Những thông tin này sẽ được vận hành theo dựa trên các opcode
Ví dụ, nếu các opcode là 1, có lẽ định nghĩa là OPCODE_LOGIN, sau đó các byte sau opcode có thể chứa một chuỗi chứa thông tin đăng nhập, vv
bool sendMessage(tcp::socket* sock, uint16_t opcode, void* data)
{
void* fullData = malloc(sizeof(uint16_t) + sizeof(data));
memcpy(fullData, (void*)opcode, sizeof(opcode));
memcpy(&fullData + sizeof(uint16_t), data, sizeof(data));
boost::asio::write(sock, boost::asio::buffer(fullData, sizeof(fullData)));
// by the way, at this point, is it safe to delete fullData to prevent memory leaks?
return true;
}
Điều này không biên dịch, tuy nhiên. Tôi nhận được một lỗi biên dịch bí ẩn liên quan đến các cuộc gọi để viết:
1>------ Build started: Project: client, Configuration: Debug Win32 ------
1> main.cpp
1>c:\boost\boost_1_47\boost\asio\impl\write.hpp(46): error C2228: left of '.write_some' must have class/struct/union
1> type is 'boost::asio::basic_stream_socket<Protocol> '
1> with
1> [
1> Protocol=boost::asio::ip::tcp
1> ]
1> did you intend to use '->' instead?
1> c:\boost\boost_1_47\boost\asio\impl\write.hpp(59) : see reference to function template instantiation 'size_t boost::asio::write<SyncWriteStream,ConstBufferSequence,boost::asio::detail::transfer_all_t>(SyncWriteStream &,const ConstBufferSequence &,CompletionCondition,boost::system::error_code &)' being compiled
1> with
1> [
1> SyncWriteStream=boost::asio::ip::tcp::socket *,
1> ConstBufferSequence=boost::asio::mutable_buffers_1,
1> CompletionCondition=boost::asio::detail::transfer_all_t
1> ]
1> c:\users\josh\documents\visual studio 2010\projects\client\client\main.cpp(53) : see reference to function template instantiation 'size_t boost::asio::write<boost::asio::ip::tcp::socket*,boost::asio::mutable_buffers_ 1>(SyncWriteStream &,const ConstBufferSequence &)' being compiled
1> with
1> [
1> SyncWriteStream=boost::asio::ip::tcp::socket *,
1> ConstBufferSequence=boost::asio::mutable_buffers_1
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Như bạn có thể thấy, các thông báo lỗi chỉ trực tiếp vào tập tin write.hpp
Boost, và không để bất kỳ mã của riêng tôi .. Tôi tin rằng tôi đang gọi write()
không chính xác theo cách nào đó, nhưng sau một giờ kiên trì và nghiên cứu các tham chiếu và ví dụ (tất cả đều sử dụng quá tải write()
hoặc đang sử dụng dữ liệu có kích thước/cấu trúc xác định cụ thể), tôi không thể xác định chính xác đang làm sai ở đây.
Ai đó có thể giúp tôi gỡ lỗi lỗi biên dịch này không?
Điều đó rất hữu ích, cảm ơn! :) Và tôi đã nhìn thấy "câu hỏi bình chọn cao nhất" nhiều lần trong googling của tôi, và tôi đã làm theo lời khuyên của nó, nhưng không được nhiều ... các ví dụ sử dụng các phiên bản khác nhau của write(), tham chiếu lớp được xây dựng dựa trên nhiều boost các luồng mà tôi không quen thuộc, v.v. – Josh1billion