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; }
bool Listener::init() { SockAddr me; if ( ip.empty() ) me = SockAddr( port ); else me = SockAddr( ip.c_str(), port ); sock = ::socket(AF_INET, SOCK_STREAM, 0); if ( sock == INVALID_SOCKET ) { log() << "ERROR: listen(): invalid socket? " << errno << endl; return false; } prebindOptions( sock ); if ( ::bind(sock, (sockaddr *) &me.sa, me.addressSize) != 0 ) { log() << "listen(): bind() failed errno:" << errno << endl; if ( errno == 98 ) log() << "98 == addr already in use" << endl; closesocket(sock); return false; } if ( ::listen(sock, 128) != 0 ) { log() << "listen(): listen() failed " << errno << endl; closesocket(sock); return false; } return true; }
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(AF_INET, SOCK_STREAM, 0); if ( sock == INVALID_SOCKET ) { log() << "ERROR: MiniWebServer listen(): invalid socket? " << OUTPUT_ERRNO << endl; return false; } prebindOptions( sock ); if ( ::bind(sock, (sockaddr *) &me.sa, me.addressSize) != 0 ) { log() << "MiniWebServer: bind() failed port:" << port << " " << OUTPUT_ERRNO << endl; if ( errno == EADDRINUSE ) log() << " addr already in use" << endl; closesocket(sock); return false; } if ( ::listen(sock, 16) != 0 ) { log() << "MiniWebServer: listen() failed " << OUTPUT_ERRNO << endl; closesocket(sock); return false; } return true; }
void xmain() { WSADATA wsaData; SOCKET RecvSocket; sockaddr_in RecvAddr; int Port = 27015; char RecvBuf[1024]; int BufLen = 1024; sockaddr_in SenderAddr; int SenderAddrSize = sizeof(SenderAddr); //----------------------------------------------- // Initialize Winsock WSAStartup(MAKEWORD(2,2), &wsaData); //----------------------------------------------- // Create a receiver socket to receive datagrams RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); prebindOptions( RecvSocket ); //----------------------------------------------- // Bind the socket to any address and the specified port. RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(Port); RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY); SockAddr a(Port); ::bind(RecvSocket, (SOCKADDR *) &a.sa, a.addressSize); // bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr)); SockAddr b; //----------------------------------------------- // Call the recvfrom function to receive datagrams // on the bound socket. printf("Receiving datagrams...\n"); recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR *) &b.sa, &b.addressSize); // (SOCKADDR *)&SenderAddr, // &SenderAddrSize); //----------------------------------------------- // Close the socket when finished receiving datagrams printf("Finished receiving. Closing socket.\n"); closesocket(RecvSocket); //----------------------------------------------- // Clean up and exit. printf("Exiting.\n"); WSACleanup(); return; }
void Listener::initAndListen() { vector<SockAddr> mine = ipToAddrs(_ip.c_str(), _port); vector<int> socks; SOCKET maxfd = 0; // needed for select() for (vector<SockAddr>::iterator it=mine.begin(), end=mine.end(); it != end; ++it){ SockAddr& me = *it; SOCKET sock = ::socket(me.getType(), SOCK_STREAM, 0); if ( sock == INVALID_SOCKET ) { log() << "ERROR: listen(): invalid socket? " << errnoWithDescription() << endl; } if (me.getType() == AF_UNIX){ #if !defined(_WIN32) if (unlink(me.getAddr().c_str()) == -1){ int x = errno; if (x != ENOENT){ log() << "couldn't unlink socket file " << me << errnoWithDescription(x) << " skipping" << endl; continue; } } #endif } else if (me.getType() == AF_INET6) { // IPv6 can also accept IPv4 connections as mapped addresses (::ffff:127.0.0.1) // That causes a conflict if we don't do set it to IPV6_ONLY const int one = 1; setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*) &one, sizeof(one)); } prebindOptions( sock ); if ( ::bind(sock, me.raw(), me.addressSize) != 0 ) { int x = errno; log() << "listen(): bind() failed " << errnoWithDescription(x) << " for socket: " << me.toString() << endl; if ( x == EADDRINUSE ) log() << " addr already in use" << endl; closesocket(sock); return; } if ( ::listen(sock, 128) != 0 ) { log() << "listen(): listen() failed " << errnoWithDescription() << endl; closesocket(sock); return; } ListeningSockets::get()->add( sock ); socks.push_back(sock); if (sock > maxfd) maxfd = sock; } static long connNumber = 0; struct timeval maxSelectTime; while ( ! inShutdown() ) { fd_set fds[1]; FD_ZERO(fds); for (vector<int>::iterator it=socks.begin(), end=socks.end(); it != end; ++it){ FD_SET(*it, fds); } maxSelectTime.tv_sec = 0; maxSelectTime.tv_usec = 10000; const int ret = select(maxfd+1, fds, NULL, NULL, &maxSelectTime); if (ret == 0){ _elapsedTime += maxSelectTime.tv_usec / 1000; continue; } _elapsedTime += ret; // assume 1ms to grab connection. very rough if (ret < 0){ int x = errno; #ifdef EINTR if ( x == EINTR ){ log() << "select() signal caught, continuing" << endl; continue; } #endif if ( ! inShutdown() ) log() << "select() failure: ret=" << ret << " " << errnoWithDescription(x) << endl; return; } for (vector<int>::iterator it=socks.begin(), end=socks.end(); it != end; ++it){ if (! (FD_ISSET(*it, fds))) continue; SockAddr from; int s = accept(*it, from.raw(), &from.addressSize); if ( s < 0 ) { int x = errno; // so no global issues if ( x == ECONNABORTED || x == EBADF ) { log() << "Listener on port " << _port << " aborted" << endl; return; } if ( x == 0 && inShutdown() ){ return; // socket closed } log() << "Listener: accept() returns " << s << " " << errnoWithDescription(x) << endl; continue; } if (from.getType() != AF_UNIX) disableNagle(s); if ( _logConnect && ! cmdLine.quiet ) log() << "connection accepted from " << from.toString() << " #" << ++connNumber << endl; accepted(s, from); } } }