wiri
wiri

Reputation: 91

Blocking sockets on Windows

I try to implement a simple http server with blocking sockets on Windows. Basically, I have a simple server that just write data to a socket when a network connection occurs before exit. The problem is that the last socket.send as no effect if I don't delay the process exit. Writing to this socket is supposed to block until all the data as been written. I have tried to use the completion condition of write, to use the non_blocking method of the socket. I still get the same problem. Note that the problem doesn't occur on Linux.

Here is the code:

#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 OK\r\n")));
    sock.send(boost::asio::buffer(std::string("Content-Length: ") + std::to_string(body.size()) + "\r\n\r\n"));
    sock.send(boost::asio::buffer(body));
    Sleep(1000); // The body would not be sent without this
    return 0;
}

Upvotes: 1

Views: 355

Answers (1)

Blablablabli
Blablablabli

Reputation: 184

According to this post, on windows the send method will block only if the kernel runs out of socket buffers.

It also say that if the program is killed, the sockets are forcibly closed and the non sent data is discarded.

I wanted to add this as a comment but I don't have enough point, sorry about that.

Upvotes: 2

Related Questions