//============================================================================== // PlainDatagramSocketImpl::create // //============================================================================== void PlainDatagramSocketImpl::create() { if(m_rpSocketDescriptor) throw SocketException(QC_T("socket already created")); SocketDescriptor::OSSocketDescriptorType socketFD; // Reset member control flags just in case this DatagramSocketImpl has been // used and closed before. This probably isn't possible, but // it is sensible to guard against it anyway. m_localPort = -1; m_remotePort = -1; // // Attempt to create a stream socket. // if( (socketFD = socket(AF_INET, SOCK_DGRAM, 0)) == QC_INVALID_SOCKET) { static const String err(QC_T("unable to create datagram socket: ")); String errMsg = err + NetUtils::GetSocketErrorString(); throw SocketException(errMsg); } // // After successfully creating a socket, we must immediately wrap // the os-supplied socket descriptor in our own reference-counted // SocketDescriptor object. // m_rpSocketDescriptor = new SocketDescriptor(socketFD); // // DatagramSockets require SO_BROADCAST enabled by default // setIntOption(SOL_SOCKET, SO_BROADCAST, 1); }
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; }
static int parseOneOption (char *opt, char* const argv[], const int argc, int *pos) { if (strcmp(opt,"-activate") == 0) { ASSERT_HAS_NEXT(); char *o = argv[++(*pos)]; if (!hasCommandOption(o)) { errorMessage = o; return 1; } (*pos)++; (*pos) -= 2; setBoolOption(o,TRUE); return 0; } else if (strcmp(opt,"-deactivate") == 0) { ASSERT_HAS_NEXT(); char *o = argv[++(*pos)]; if (!hasCommandOption(o)) { errorMessage = o; return 1; } (*pos)++; (*pos) -= 2; setBoolOption(o,FALSE); return 0; } else if (hasCommandOption(opt)) { char *o = commandOptionGetOption(opt); (*pos)++; switch(getOptionType(o)) { case OPTION_INT: { ASSERT_HAS_NEXT(); int val = atoi(argv[*pos]); setIntOption(o,val); (*pos)++; (*pos) -= 2; } break; case OPTION_STRING: { ASSERT_HAS_NEXT(); setStringOption(o,strdup(argv[*pos])); (*pos)++; (*pos) -= 2; } break; case OPTION_FLOAT: { ASSERT_HAS_NEXT(); //TODO (*pos)++; (*pos) -= 2; } break; case OPTION_BOOL: // if user has given value as separate argument if (*pos < argc && !isOption(argv[*pos])) { char *bVal = argv[*pos]; if (streq(bVal,"TRUE") || streq(bVal,"t") || streq(bVal,"1") || streq(bVal,"true")) setBoolOption(o,TRUE); else setBoolOption(o,FALSE); } // otherwise mentioning an option sets it to TRUE else { setBoolOption(o, TRUE); (*pos) -= 1; } break; } return 0; } else { errorMessage = opt; return 1; } }