bool MiniWebServer::init(const string &ip, int _port) { port = _port; SockAddr me; if ( ip.empty() ) me = SockAddr( port ); else me = SockAddr( ip.c_str(), port ); sock = ::socket(me.family, SOCK_STREAM, 0); if ( sock == INVALID_SOCKET ) { log() << "ERROR: MiniWebServer listen(): invalid socket? " << errno << endl; return false; } prebindOptions( sock ); if ( ::bind(sock, me.getSockAddr(), me.addressSize) != 0 ) { log() << "MiniWebServer: bind() failed port:" << port << " errno:" << errno << endl; if ( errno == 98 ) log() << "98 == addr already in use" << endl; closesocket(sock); return false; } if ( ::listen(sock, 16) != 0 ) { log() << "MiniWebServer: listen() failed " << errno << endl; closesocket(sock); return false; } return true; }
void MiniWebServer::run() { SockAddr from; while ( 1 ) { int s = accept(sock, from.getSockAddr(), &from.addressSize); if ( s < 0 ) { if ( errno == ECONNABORTED ) { log() << "Listener on port " << port << " aborted." << endl; return; } log() << "MiniWebServer: accept() returns " << s << " errno:" << errno << endl; sleepmillis(200); continue; } disableNagle(s); RARELY log() << "MiniWebServer: connection accepted from " << from.toString() << endl; accepted( s, from ); closesocket(s); } }