// }}}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;
}
Exemple #3
0
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);
    }
}
Exemple #4
0
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();
}
Exemple #5
0
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
}