【问题标题】:Declaring a boost asio socket, acceptor and endpoint in a class headerfile在类头文件中声明 boost asio 套接字、接受器和端点
【发布时间】:2013-10-21 17:39:48
【问题描述】:

我有一个用 boost asio 制成的 TCP/IP 服务器,它封装在一个类中。现在我想在类头文件中声明套接字、eindpoint 和接受器,以便我可以创建使用套接字的成员函数。服务器现在在类构造函数中运行。我尝试使用如下初始化列表:

CommunicationModuleTCPIP::CommunicationModuleTCPIP(bool Server,
                                               string IPAdress,
                                               int PortNumber)
 : Sock(new boost::asio::ip::tcp::socket(IOService));
{
// Constructor code

但这会产生编译器错误。 Sock 在标头中声明如下:

SmartSocket Sock;

SmartSocket 是一个共享指针,定义如下。

typedef boost::shared_ptr<boost::asio::ip::tcp::socket> SmartSocket;

谁能告诉我是否可以在头文件中声明一个套接字、接受器和端点并初始化这些对象?

欢迎提出任何建议!

更新

下面是类头文件代码和构造函数代码:

带有端点、套接字和接受器声明的头文件:

public:

// Constructor and destructor
CommunicationModuleTCPIP(bool   Server,
                         string IPAdress,
                         int PortNumber);
~CommunicationModuleTCPIP();

int Connect();
int Disconnect();
int SendData(SmartSocket sock);
int RecieveData(SmartSocket sock);
int Send(SmartSocket Sock);
int Recieve(SmartSocket sock);
int CheckConnection();

char SendBuffer[20];
char RecvBuffer[20];

SmartSocket Sock;
tcp::endpoint Endpoint;
boost::asio::ip::tcp::acceptor Acceptor;

构造函数,当我在构造函数中创建它们时,在 cmets 中是套接字、端点和接受器。这可行,但我想让这些对象成为类的一部分,以便我可以在代码其他部分的成员函数中使用它们(如果可能的话?)。

CommunicationModuleTCPIP::CommunicationModuleTCPIP(bool Server,
                                               string IPAdress,
                                               int PortNumber){
:Endpoint(ip::address::from_string(IPAdress),PortNumber),
 Acceptor(IOService, Endpoint),
 Sock(new boost::asio::ip::tcp::socket(IOService)

if(Server){

    cout << "Setting up server" << endl;

    //ip::tcp::endpoint Endpoint(ip::address::from_string(IPAdress),PortNumber);

    // Create acceptor
    //boost::asio::ip::tcp::acceptor Acceptor(IOService, Endpoint);

    // Create socket
    //SmartSocket Sock(new boost::asio::ip::tcp::socket(IOService));

    cout << "Before accept..." << endl;

     // Waiting for client
     Acceptor.accept(*Sock);

    cout << "Server set up" << endl;

 }

我得到的编译器错误如下:

\CommunicationModuleTCPIP.cpp:6:30: fout: 没有匹配函数调用‘boost::asio::basic_socket_acceptor::basic_socket_acceptor()’

fout: ':' 标记之前的预期主表达式 ..\CommunicationModuleTCPIP.cpp:7:2: fout: 预期的 ‘;’ 在 ‘:’ 标记之前 ..\CommunicationModuleTCPIP.cpp:199:2: fout: 输入结束时预期的“}”

C:\boost_1_54_0/boost/asio/error.hpp:244:45: let op: ‘boost::asio::error::system_category’ 已定义但未使用 [-Wunused-variable] C:\boost_1_54_0/boost/asio/error.hpp:246:45: let op: ‘boost::asio::error::netdb_category’ 已定义但未使用 [-Wunused-variable] C:\boost_1_54_0/boost/asio/error.hpp:248:45: let op: ‘boost::asio::error::addrinfo_category’ 已定义但未使用 [-Wunused-variable] C:\boost_1_54_0/boost/asio/error.hpp:250:45: let op: 'boost::asio::error::misc_category' 已定义但未使用 [-Wunused-variable]

【问题讨论】:

  • 如果您发布实际的编译器错误会有所帮助
  • 感谢您的评论!我添加了编译器错误
  • 构造函数定义语法如下(注意body {} 块从哪里开始): CommunicationModuleTCPIP::CommunicationModuleTCPIP(bool Server, string IPAdress, int PortNumber) : Endpoint(.......) , Acceptor(......), Sock(....) { /*body*/}
  • 感谢您的评论,使语法正确,但仍然有相同的错误

标签: c++ boost boost-asio shared-ptr


【解决方案1】:

唯一明显的错误是初始化列表末尾的流氓;

如果您在删除它时仍然有错误,也许您可​​以发布一个小而完整的代码示例来演示错误以及错误本身。否则,很难猜测其余代码可能在做什么。

【讨论】:

  • 感谢您的回答我已经添加了头文件代码和构造函数代码。
  • @Roy08:现在你的开头 { 在错误的地方。将其移到初始化列表之后,以标记构造函数主体的开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2011-10-15
  • 2011-12-05
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多