我使用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
答案 0 :(得分:1)
socket定义在哪里?听起来它没有正确定义导致write和read_until函数抛出错误。
在write和read_until 中调用read_some和write_some(编辑)查看你的代码,除非socket是一个全局可用的,它如何传递到你的会话函数,我看到你评论你将在服务器函数中声明它们,但除非你省略了更多的代码从示例中看,void session()看起来无效。
答案 1 :(得分:0)
你定义了一个socket对象,这个对象的名字和windows下的Socket有冲突,需要修改这个名字。