/*********************************************************************** * 函数名称: initData * 函数功能: 初始化相关数据 * 参数说明: * 作者 : 爱在梦幻谷 * 最后修改: 2013年3月25日10:37:05 ***********************************************************************/ void login::initData() { m_bLinkOk = false; //配置IP地址输入的合法性 setIP4Validator(ui->serverIPLineEdit); setIP4Validator(ui->LocalIPLineEdit); ui->serverIPLineEdit->setPlaceholderText("远程服务器IP地址"); ui->LocalIPLineEdit->setToolTip("如果获取本机IP地址有误,请重新填写"); //获取本机IP地址 QString sLocalIPAdd = getLocalIPAddress().toString(); ui->LocalIPLineEdit->setText(sLocalIPAdd); ui->serverIPLineEdit->setText("127.0.0.1"); //测试定时器 m_pTestLinkTimer = new QTimer(this); m_pTestLinkTimer->setInterval(TEST_TIMEOUT); connect(m_pTestLinkTimer,SIGNAL(timeout()),this,SLOT(testLinkTimerOut())); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);//默认不可用,可以测试通过才能使用 ui->buttonBox->button(QDialogButtonBox::Ok)->setToolTip("请先进行【连接测试】"); ui->errorLog->hide(); ui->errorLog->setReadOnly(true); }
void login::on_buttonBox_clicked(QAbstractButton *button) { if("确定" == button->text()) { QString sLocalIP = getLocalIPAddress().toString(); QString sRemoteIP = ui->serverIPLineEdit->text(); emit sendIPToMain(sLocalIP, sRemoteIP);//向主程序发送一个信息号,告知本机IP地址和远程IP地址(使用全局变量也许是一个更好的办法) } else { emit cancelBtnClick(); } }
LiLANMangeServer::LiLANMangeServer(QObject *parent):QTcpServer(parent) { rootUdpPort=3001;//3001; multicastAddress="236.0.0.26"; goalPort=3000;//3000;988 myName="DevelopmentServer"; textCode=QTextCodec::codecForName("UTF-8"); rootUdpAddress="192.168.78.101"; autoListen(); rootUdpSocket=new QUdpSocket(this); rootUdpSocket->bind(QHostAddress::AnyIPv4,rootUdpPort,QUdpSocket::ReuseAddressHint); rootUdpSocket->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0);//防止自己接受 // 224.0.1.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效。 // 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。 rootUdpSocket->joinMulticastGroup(QHostAddress(multicastAddress));//加入组播地址 connect(rootUdpSocket,SIGNAL(readyRead()),this,SLOT(onRootUdpNews())); replayClientTimer=new QTimer(this); replayClientTimer->setSingleShot(false); connect(replayClientTimer,SIGNAL(timeout()),this,SLOT(iAmHere())); replayClientRange=new QTimer(this); replayClientRange->setSingleShot(true); connect(replayClientRange,SIGNAL(timeout()),this,SLOT(replayClientTimerStop())); tcpNewsList=new QHash<qintptr,QString>; tcpSocketRegistery=new QHash<qintptr,LiTcpSocketString*>; tcpSocketFileRegistery=new QHash<qintptr,LiTcpSocketFileClient*>; tcpSocketFileServerRegistery=new QHash<quint32,LiTcpSocketFileServer*>; udpaClientRegistery=new QHash<QHostAddress*,quint16*>; udpGoalPortList=new QList<quint16>; localIPV4Address=getLocalIPAddress(); // connect(rootUdpSocket,SIGNAL(readyRead()),this,SLOT(tempNew())); // 按摩端需求 massagePort=6000; connectControl=true;//防止多次Tcp连接 //face需求 quint16 tempQuint16=3002; addBroadcastPort(tempQuint16); }
char* SocketServer::getServerIPAddress(){ if(ipAddress[0] == 0){ getLocalIPAddress(ipAddress, 10); } return ipAddress; }
int SocketServer::Start(){ int ret = 0; u32 optval = 0; int cnt = 0; //Get the IP Address ret = getLocalIPAddress(ipAddress, 10); if(ret != 0){ return -1; } mServerSocket = socket(AF_INET, SOCK_STREAM, 0); if (mServerSocket < 0){ return -1; } //Set nonblocking optval = fcntl( mServerSocket, F_GETFL, 0 ); STATNVAL(optval, -1, CLEAN_AND_EXIT); ret = fcntl(mServerSocket, F_SETFL, optval | O_NONBLOCK); STATNVAL(ret, -1, CLEAN_AND_EXIT); memset((char*)&mServerAddr, 0, sizeof(struct sockaddr_in)); //Bind to port (try 500 numbers if needed) cnt = 0; do{ mServerAddr.sin_family = AF_INET; mServerAddr.sin_addr.s_addr = INADDR_ANY; mServerAddr.sin_port = htons(mPort); if (bind(mServerSocket, (struct sockaddr *) &mServerAddr, sizeof(struct sockaddr_in)) == 0){ break; } mPort++; cnt++; }while(cnt < 500); if(cnt == 500){ return -2; } //Start the read thread pthread_attr_t attr; ret = pthread_attr_init(&attr); if(ret != 0){ goto CLEAN_AND_EXIT; } ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if(ret != 0){ pthread_attr_destroy(&attr); goto CLEAN_AND_EXIT; } ret = pthread_create(&mReadThread, &attr, SocketServer::sReadLoop, (void*)this); pthread_attr_destroy(&attr); goto EXIT; CLEAN_AND_EXIT: close(mServerSocket); mServerSocket = INVALID_SOCKET; EXIT: return ret; }