【发布时间】:2015-02-12 20:30:53
【问题描述】:
我开始学习 boost::asio 并尝试制作简单的客户端-服务器应用程序。现在我的服务器有问题。代码如下:
int main(int argc, char* argv[])
{
using namespace boost::asio;
io_service service;
ip::tcp::endpoint endp(ip::tcp::v4(), 2001);
ip::tcp::acceptor acc(service, endp);
for (;;)
{
socker_ptr sock(new ip::tcp::socket(service));
acc.accept(*sock);
for (;;)
{
byte data[512];
size_t len = sock->read_some(buffer(data)); // <--- here exception at second iteration
if (len > 0)
write(*sock, buffer("ok", 2));
}
}
}
它正确接受客户端套接字,正确读取,然后写入数据并开始新的迭代。在第二次迭代中抛出异常。看起来像: 我不明白为什么会这样? 我只需要服务器必须在客户端存在时连续读/写。当客户端离开时,服务器必须接受下一个客户端。
所以主要问题是:为什么会发生异常以及如何避免它?
...
UPDATE1:我发现在第一次迭代时,读/写操作的错误代码都是成功的。但是(!)在异常重新出现的地方的第二次迭代中,错误代码是“文件结束”。但为什么?
【问题讨论】:
-
您应该将缓冲区的最大大小 (512) 作为第二个参数传递给 read_some 的缓冲区。我怀疑这是根本原因,但是缓冲区没有合理的方法来确定字节数组的长度。
-
嗯,这无济于事。我注意到第一次迭代完全通过了,但在第二次迭代中它失败了。我尝试添加缓冲区“size_t len = sock->read_some(buffer(data, 512));”的大小。但这没有帮助。问题依然存在。
-
@sehe:#tmyk!感谢您指出了这一点。我不知道编译器有一种技术可以自动检测数组中的元素数量。我的立场是正确的。
-
干杯 :) 我花了数年时间学习这些东西,除此之外,真的很棒。
标签: c++ boost boost-asio