/* * 设置int类型的option */ bool Socket::setIntOption (int option, int value) { bool rc=false; if (checkSocketHandle()) { rc = (setsockopt(_socketHandle, SOL_SOCKET, option, (const void *)(&value), sizeof(value)) == 0); } return rc; }
bool Socket::setTcpQuickAck(bool quickAck) { bool rc = false; int quickAckInt = quickAck ? 1 : 0; if (checkSocketHandle()) { rc = (setsockopt(_socketHandle, IPPROTO_TCP, TCP_QUICKACK, (const void *)(&quickAckInt), sizeof(quickAckInt)) == 0); } return rc; }
bool Socket::setTcpNoDelay(bool noDelay) { bool rc = false; int noDelayInt = noDelay ? 1 : 0; if (checkSocketHandle()) { rc = (setsockopt(_socketHandle, IPPROTO_TCP, TCP_NODELAY, (const void *)(&noDelayInt), sizeof(noDelayInt)) == 0); } return rc; }
bool Socket::connect( AddrInet& addr) { int ret; if (!checkSocketHandle()) { return false; } struct sockaddr* remoteaddr = ( struct sockaddr*)addr.getAddr(); ret =::connect(_socketHandle, remoteaddr, sizeof(struct sockaddr)); return ret; }
/* * 设置time类型的option */ bool Socket::setTimeOption(int option, int milliseconds) { bool rc=false; if (checkSocketHandle()) { struct timeval timeout; timeout.tv_sec = (int)(milliseconds / 1000); timeout.tv_usec = (milliseconds % 1000) * 1000000; rc = (setsockopt(_socketHandle, SOL_SOCKET, option, (const void *)(&timeout), sizeof(timeout)) == 0); } return rc; }
bool Socket::setSoLinger(bool doLinger, int seconds) { bool rc=false; struct linger lingerTime; lingerTime.l_onoff = doLinger ? 1 : 0; lingerTime.l_linger = seconds; if (checkSocketHandle()) { rc = (setsockopt(_socketHandle, SOL_SOCKET, SO_LINGER, (const void *)(&lingerTime), sizeof(lingerTime)) == 0); } return rc; }
bool Socket::bind( AddrInet& addr) { int ret; if (!checkSocketHandle()) { return false; } struct sockaddr* serveraddr = ( struct sockaddr*)addr.getAddr(); ret = ::bind(_socketHandle,serveraddr , sizeof(struct sockaddr)); if(ret == 0) { return true; } return false; }
/* * 是否阻塞 */ bool Socket::setSoBlocking(bool blockingEnabled) { bool rc=false; if (checkSocketHandle()) { int flags = fcntl(_socketHandle, F_GETFL, NULL); if (flags >= 0) { if (blockingEnabled) { flags &= ~O_NONBLOCK; // clear nonblocking } else { flags |= O_NONBLOCK; // set nonblocking } if (fcntl(_socketHandle, F_SETFL, flags) >= 0) { rc = true; } } } return rc; }
bool serverSocket::listen() { if (!checkSocketHandle()) { return false; } setSoLinger(false,0); setReuseAddress(true); setIntOption(SO_KEEPALIVE,1); setIntOption(SO_SNDBUF,640000); setIntOption(SO_RCVBUF,640000); setTcpNoDelay(true); if(::bind(_socketHandle,(struct sockaddr *) &_address,sizeof(_address)) <0) { return false; } if(::listen(_socketHandle,backLog) <0) { return false; } return true; }