正在阻止Windows上的套接字
Blocking sockets on Windows
我试图在Windows上实现一个带有阻塞套接字的简单http服务器。基本上,我有一个简单的服务器,当网络连接在退出之前发生时,它只将数据写入套接字。问题是,如果我不延迟进程退出,最后一个socket.send
将无效。在写入所有数据之前,应该阻止对此套接字的写入。我试着使用write的完成条件,使用socket的non_blocking方法。我仍然有同样的问题。请注意,Linux上不会出现此问题。
这是代码:
#include <boost/asio.hpp>
int main(int argc, char *argv[]) {
char *address = "0.0.0.0";
char *port = "8180";
boost::asio::io_service io_service;
boost::asio::ip::tcp::acceptor acceptor(io_service);
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(address, port);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor.open(endpoint.protocol());
acceptor.bind(endpoint);
acceptor.listen();
boost::asio::ip::tcp::socket sock(io_service);
acceptor.accept(sock);
std::string body("Hello, World!");
sock.send(boost::asio::buffer(std::string("HTTP/1.1 200 OKrn")));
sock.send(boost::asio::buffer(std::string("Content-Length: ") + std::to_string(body.size()) + "rnrn"));
sock.send(boost::asio::buffer(body));
Sleep(1000); // The body would not be sent without this
return 0;
}
根据这篇文章,在windows上,只有当内核的套接字缓冲区用完时,send方法才会阻塞。
它还说,如果程序被终止,套接字将被强制关闭,未发送的数据将被丢弃。
我想补充这一点作为评论,但我没有足够的观点,很抱歉。
相关文章:
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- Raspbian-Windows openCV videostream之间的套接字
- Windows 2012 R2 closesocket()挂在侦听套接字上
- 用于线程间通信的 Windows 套接字
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- Windows 套接字接收标志
- 为什么 Windows udp 接收套接字上的超时总是比 SO_RCVTIMEO 设置的长 500 毫秒
- Windows,C++:一个服务器套接字上有两个连接
- C++如何从TCP套接字(windows)中检索ACK
- 用于 Windows 7 中的 C 套接字编程的 IDE
- POSIX套接字与Web套接字与Windows TCP/IP套接字
- Windows 套接字编程 - 错误代码 0
- windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号
- Windows TCP IP 套接字编程
- 正在阻止Windows上的套接字
- 将Unix套接字移植到Windows
- C++、Windows中的简单SSL套接字
- 我如何从UDP套接字(Windows c++)获得IP信息