예제 #1
0
/***********************************************************************
 * 函数名称: 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);
}
예제 #2
0
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);
}
예제 #4
0
char* SocketServer::getServerIPAddress(){
    if(ipAddress[0] == 0){
        getLocalIPAddress(ipAddress, 10);
    }
    return ipAddress;
}
예제 #5
0
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;
}