C2228:TCP asio服务器出错

时间:2014-12-19 18:02:05

标签: c++ boost boost-asio

我使用boost :: asio库制作TCP服务器。

此时此刻,我已经使用了这样的代码: 注意:这是一个非营利性的测试服务器。

    int main(){
        const int SERVER_PORT = 60000;

        try{
            ...
            //declare the io_service, endpoint, acceptor and socket
            ...
            {
                acceptor.accept(socket);
                boost::asio::write(socket, boost::asio::buffer(message));
                boost::asio::streambuf received;
                boost::asio::read_until(socket, received, "\r\n");
                ...
                //all server operations
                ...
                }
            }
        }
        catch (std::exception& ex)
        {
            std::cerr << "Exception " << ex.what() << std::endl;
        }

        return 0;
    }

现在,我还没有改进代码,我开始通过这样的函数组织我的代码:

    void session(){
        boost::asio::write(socket, boost::asio::buffer(message));
        boost::asio::streambuf received;
        boost::asio::read_until(socket, received, "\r\n");
        ...
        //All server operations
        ...
    }

    void server(boost::asio::io_service& io_service, const int SERVER_PORT){
        ...
        //declare the io_service, endpoint, acceptor and socket
        ...
        session();//Call Session
    }


    int main(){
        const int SERVER_PORT = 60000;
        boost::asio::io_service io_service;
        server(io_service, SERVER_PORT);

        return 0;
    }

我的问题是,使用这些函数,它不会编译。 我有Visual Studio编译错误:C2228

  

错误C2228:句点左侧的操作数.read_some不是a   阶级,结构或联合

     

错误C2228:句点.write_some左侧的操作数不是a   阶级,结构或联合

我找不到如何解决这个问题。

非常感谢!

编辑:基于答案的解决方案

除非socket是全局可变的,否则void session()无效。 好的是:

void session(boost::asio::ip::tcp::socket& socket)

非常感谢 Orrkid

2 个答案:

答案 0 :(得分:1)

socket定义在哪里?听起来它没有正确定义导致write和read_until函数抛出错误。

在write和read_until

中调用read_some和write_some

(编辑)查看你的代码,除非socket是一个全局可用的,它如何传递到你的会话函数,我看到你评论你将在服务器函数中声明它们,但除非你省略了更多的代码从示例中看,void session()看起来无效。

答案 1 :(得分:0)

你定义了一个socket对象,这个对象的名字和windows下的Socket有冲突,需要修改这个名字。