// }}}1 void Socket::doBind() { // FIXME: check if object is already bound if (this->listening) { throw BindException("Socket already in use"); } else { // try to bind to port if (::bind(this->fd, reinterpret_cast<struct sockaddr*>(&this->serverAddress), sizeof(this->serverAddress)) == -1) { throw BindException(errno); } } }
//============================================================================== // PlainDatagramSocketImpl::bind // // Before a server socket enters the passive state (by listen()) it must be // bound to a port and (optionally) a local interface. // // A null InetAddress means that the socket will be bound to ANY interface. // A zero port indicates that the system will choose the next available port. //============================================================================== void PlainDatagramSocketImpl::bind(InetAddress* pAddress, int port) { if(port == -1) throw IllegalArgumentException(QC_T("invalid port number")); testSocketIsValid(); // // Create a sockaddr structure with the requested port and i/p addr // struct sockaddr_in sa; ::memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(port); // convert port to network byte order if(pAddress) { m_rpLocalAddr = pAddress; } else { m_rpLocalAddr = InetAddress::GetAnyHost(); } QC_DBG_ASSERT(m_rpLocalAddr); ::memcpy(&sa.sin_addr.s_addr, m_rpLocalAddr->getAddress(), m_rpLocalAddr->getAddressLength()); sockaddr* pLocalAddr = reinterpret_cast<struct sockaddr*>(&sa); if(::bind(m_rpSocketDescriptor->getFD(), pLocalAddr, sizeof(struct sockaddr_in)) < 0) { String errMsg = NetUtils::GetSocketErrorString(); throw BindException(errMsg); } // // If a port number of zero was specified, the underlying system will assign // a port number automatically. We must call getsockname() to retrieve the // port number assigned. // if(port == 0) { cel_socklen_t sasize = sizeof(struct sockaddr_in); if(::getsockname(m_rpSocketDescriptor->getFD(), pLocalAddr, &sasize) < 0) { String errMsg = NetUtils::GetSocketErrorString(); throw SocketException(errMsg); } port = ntohs(sa.sin_port); } m_localPort = port; }
void StreamServerSocket::bind( const SocketAddress& sockaddr ) { if ( m_fd < 0 ) m_fd = socket( sockaddr.linkProtocol(), SOCK_STREAM, 0 ); if ( m_fd < 0 ) { throw CException("Error creating socket", m_fd); } const struct sockaddr* raw = sockaddr.raw(); socklen_t socklen = sockaddr.rawlen(); int rc = ::bind( m_fd, raw, socklen ); if( rc ) { throw BindException("Error on bind", errno); } }
Server::Server(uint32_t port) { _terminated = false; sockfd = socket(PF_INET, SOCK_STREAM, 0); if (sockfd == -1) throw SocketException(); server.sin_family = AF_INET; // host byte order server.sin_port = htons(port); // short, network byte order server.sin_addr.s_addr = htonl(INADDR_ANY); // fill in the IP address of the machine memset(&(server.sin_zero), '\0', 8); // zero the rest of the struct if (bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) < 0) throw BindException(); if (listen(sockfd, backlog) < 0) throw ListenException(); }
void TCPSocket::bind(unsigned short port) { if (this->_state != CREATED) { throw SocketStateException("Wrong state for operation"); } struct sockaddr_in local_addr; memset(&local_addr, 0, sizeof (local_addr)); local_addr.sin_family = AF_INET; local_addr.sin_port = htons(port); local_addr.sin_addr.s_addr = INADDR_ANY; if (::bind(this->_b->_sock, (const sockaddr*) & local_addr, sizeof (local_addr)) == -1) { throw BindException(errno); } #ifdef DEBUG fprintf(stderr, "socket %d bound to port %d\n", _b->_sock, port); #endif }