我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送一个回复.问题是客户端有时可能对答案没兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃.什么是防止崩溃的最佳做法?有没有办法检查线的另一边是否还在读?(select()似乎在这里不起作用,因为它总是说套接字是可写的).或者我应该用处理程序捕获SIGPIPE并忽略它?
我正在编写一个服务器,它接受来自设备的数据并对其进行处理.除非网络中断(即,如果我拔下以太网电缆,然后重新连接),一切正常.我正在使用read_until(),因为设备使用的协议会终止具有特定字节序列的数据包.当数据流中断时,read_until()会按预期阻塞.但是,当流再次启动时,它仍然被阻止.如果我使用Wireshark查看数据流,设备将继续发送,并且每个数据包都由网络堆栈确认.但是,如果我看bytes_readable它始终是0.我如何检测中断,以及如何重新建立数据流的连接?以下是代码段,并提前感谢您提供的任何帮助.[对我来说很容易,这是我的第一个Stack Overflow问题......是的,我确实试图寻找答案.]
using boost::asio::ip::tcp;
boost::asio::io_service IOservice;
tcp::acceptor acceptor(IOservice, tcp::endpoint(tcp::v4(), listenPort));
tcp::socket socket(IOservice);
acceptor.accept(socket);
for (;;)
{
len = boost::asio::read_until(socket, sbuf, end);
// Process sbuf
// etc.
}
Run Code Online (Sandbox Code Playgroud)