コード例 #1
0
ファイル: miniwebserver.cpp プロジェクト: petewarden/mongo
    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;
    }
コード例 #2
0
    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;
    }
コード例 #3
0
ファイル: miniwebserver.cpp プロジェクト: phildarnowsky/mongo
    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;
    }
コード例 #4
0
ファイル: sock.cpp プロジェクト: mharris717/mongo
    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;
    }
コード例 #5
0
ファイル: message.cpp プロジェクト: erickt/mongo
    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);
            }
        }
    }