예제 #1
0
qint32 SVT_UdpSocket::sendTo(const SVT_IpAddress &ip, quint16 port, const char *buf, quint32 siz)
{
    sockaddr_in dest;
    dest.sin_family=AF_INET;
    dest.sin_port=htons(port); ///监听端口
    dest.sin_addr.s_addr=htonl(ip.asLong()); ///本机

    //test=connect(sock,(sockaddr *)&dest,sizeof(dest));
    //printf("connect result %d\n",test);
    qint32 ret=sendto(mSock,buf,siz,0,(sockaddr *)&dest,sizeof(dest));
    return ret;
}
예제 #2
0
bool SVT_TcpSocket::connect(const SVT_IpAddress &ip, quint16 port)
{
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr =htonl(ip.asLong());
    addr.sin_port = htons (port);
    u_long noblock=1;
    bool ret=false;
    struct timeval tval;
#ifdef Q_OS_WIN32
    ioctlsocket(mSock,FIONBIO,&noblock);
#else
     ioctl(mSock, FIONBIO, &noblock); //设置为非阻塞模式
#endif

	::connect(mSock,(struct sockaddr *)&addr, sizeof (struct sockaddr_in));
        for(int i=0;i<10&&(!mbExit || !(*mbExit));i++)
        {
            fd_set rset, wset;
            FD_ZERO(&rset);
            FD_SET(mSock,&rset);
            wset=rset;
            tval.tv_sec = 2;
            tval.tv_usec = 0;
            if(select(mSock+1, &rset, &wset, NULL,&tval) > 0)
            {
                if(FD_ISSET(mSock, &rset) || FD_ISSET(mSock, &wset))
                {
                    int err;
                    socklen_t len=sizeof(err);
                    if(getsockopt(mSock, SOL_SOCKET, SO_ERROR, (char *)&err,&len) >=0)
                    {
                        ret=true;
                        break;
                    }
                }
            }
        }
    noblock=0;
#ifdef Q_OS_WIN32
    ioctlsocket(mSock,FIONBIO,&noblock);
#else
    ioctl(mSock, FIONBIO, &noblock); //设置为阻塞模式
#endif
    qDebug()<<"connect"<< ret;
    return ret;
    //
}
void SVT_NetgearSpecificFSM::updateGettingAttacheDevice()
{
    SVT_Soap &soap=*mSoap;
    soap.setRouteType(mRouteType);
    QMap<QString,QString> soapret;
    soap.doFunc(mHost,"DeviceInfo","GetAttachDevice",NULL,&soapret);
//    qDebug()<<soapret;

    QString resultstr = soapret.value("NewAttachDevice");
    qDebug()<<resultstr;
    QStringList strlst=resultstr.split("@");
    bool dataGetted=false;
    for(int i=1;i<strlst.count();i++)
    {
        SVT_NodeInfoRef nodeinfoRef(new QMap<int,QString>);
        QStringList slinelist=strlst[i].split(";");
        SVT_IpAddress ip;
        SVT_MacAddress mac;
        if(slinelist.count()>=4)
        {
            ip.Set(slinelist[1]);
            mac.SetAddress(slinelist[3]);
            if(0!=slinelist[2].compare("<unknown>",Qt::CaseInsensitive)
                    && 0!=slinelist[2].compare("--",Qt::CaseInsensitive))
            {
                nodeinfoRef->insert(NIE_ATTACHDEVICE_NAME,slinelist[2]);
            }

        }
        if(slinelist.count()>=5)
        {
            nodeinfoRef->insert(NIE_ATTACHDEVICE_ISWIRED
                                ,(slinelist[4].toLower()=="wireless")?"n":"y");
        }
        if(slinelist.count()>=7)
        {
            nodeinfoRef->insert(NIE_ATTACHDEVICE_LINKSPEED,slinelist[5]);
            nodeinfoRef->insert(NIE_ATTACHDEVICE_SIGNALSTRENGTH,slinelist[6]);
        }
        if(slinelist.count() >=8)
        {
            nodeinfoRef->insert(NIE_ATTACHDEVICE_BLOCKED,slinelist[7]=="Block"?"y":"n");
        }
        if(ip.isValid() && mac.isValid())
        {
            mHelper->mMethod->mNodePool->nodeDetected(mHelper->mMethod,ip,mac,nodeinfoRef);
//                    mSoapState=SS_END;

            dataGetted=true;
        }
    }
    if(dataGetted )
    {

#ifdef BLOCK_DEVICE

#ifdef REFRESH_ATTACHDEVICE_WHEN_NEW_DEV_DETECTED
        CORE_LOCK();
        GET_PROGUARD()->mProgardFlags &= ~SVT_ProgardThread::PF_REFRESH_ATTACHDEVICE;
        CORE_UNLOCK();
//        mRefreshTimer.stop();
        mstartRefreshDT=QDateTime::currentDateTime().addYears(20);
#endif

 //        changeState(FS_END);
       changeState(FS_GETTING_ENABLESTAT);
#else
       changeState(FS_END);
#endif
    }
    else
    {
        if(mQuickPassthrough || ++mRetryTimes>ATTACH_DEVICE_RETRY_TIME )
        {
            changeState(FS_END);
        }
        else
        {
            mDummyBeforThisTime=QDateTime::currentDateTime().addMSecs(DUMMY_WHEN_ATTACH_DEVICE_ERR);
        }
    }

}
void SVT_NetgearSpecificFSM::updateGettingExtenderAttatcheDevice()
{
    QMap<QString,QString> soapret;
	QMap<QString,QString> soapparas;
	soapparas.insert("NewUsername","admin");
    soapparas.insert("NewPassword","password");

	QMap<unsigned long,QString> extenderDevMap;
	int iDeviceCount = 0;
	_ListNode<SVT_NodeRef> *pLoop=GET_CORE().mExtenderList.pFirst;
	while(pLoop)
	{
		if(!pLoop->data.isNull())
		{
			SVT_Soap &soap=*mSoap;
			soap.setRouteType(mRouteType);

			QString strIp = pLoop->data->mIp.toString();

			unsigned long ulIp = inet_addr(strIp.toStdString().c_str());
			//QString strTemp = strIp + ":Extender";

			bool btemp=soap.doFunc(strIp,"DeviceConfig","Authenticate",&soapparas,&soapret);
			if (btemp)
			{
				soapret.clear();
				soap.doFunc(strIp,"DeviceInfo","GetAttachedDevice",NULL,&soapret);

				QString resultstr = soapret.value("NewAttachDevice");
				qDebug()<<resultstr;
				if (0 == resultstr.compare(""))
				{
					resultstr = soapret.value("AttachededDeviceList");
				}
				if (0 != resultstr.compare(""))
				{
					extenderDevMap.insert(ulIp,resultstr);
					QStringList strlst=resultstr.split("@");

					for(int j=1;j<strlst.count();j++)
					{
						QStringList slinelist=strlst[j].split(";");
						SVT_IpAddress ip;
						SVT_MacAddress mac;
						if(slinelist.count()>=4)
						{
							ip.Set(slinelist[1]);
							mac.SetAddress(slinelist[3]);

							if(ip.isValid() && mac.isValid())
							{
								iDeviceCount++;
							}
						}
					}
				}

			}		
		}
		pLoop=pLoop->pNext;
	}

	if (iDeviceCount > 0)
	{
		int iTempCount = 0;
		QMap<unsigned long,QString>::iterator it = extenderDevMap.begin();
		for (;it != extenderDevMap.end(); it++) 
		{
			unsigned long ulIp = it.key();
			QString strTemp = it.value();
			QStringList strlst = strTemp.split("@");

			for(int i=1;i<strlst.count();i++)
			{
				SVT_NodeInfoRef nodeinfoRef(new QMap<int,QString>);
				QStringList slinelist=strlst[i].split(";");
				SVT_IpAddress ip;
				SVT_MacAddress mac;
				if(slinelist.count()>=4)
				{
					ip.Set(slinelist[1]);
					mac.SetAddress(slinelist[3]);
					if(0!=slinelist[2].compare("<unknown>",Qt::CaseInsensitive)
						&& 0!=slinelist[2].compare("--",Qt::CaseInsensitive))
					{
						nodeinfoRef->insert(NIE_ATTACHDEVICE_NAME,slinelist[2]);
					}
				}
				if(slinelist.count()>=5)
				{
					nodeinfoRef->insert(NIE_ATTACHDEVICE_ISWIRED
						,(slinelist[5].toLower()=="wireless")?"n":"y");
				}
				if(slinelist.count()>=7)
				{
					nodeinfoRef->insert(NIE_ATTACHDEVICE_LINKSPEED,slinelist[5]);
					nodeinfoRef->insert(NIE_ATTACHDEVICE_SIGNALSTRENGTH,slinelist[6]);
				}
				if(slinelist.count() >=8)
				{
					nodeinfoRef->insert(NIE_ATTACHDEVICE_BLOCKED,slinelist[7]=="Block"?"y":"n");
				}
				if(ip.isValid() && mac.isValid())
				{
					nodeinfoRef->insert(NIE_ISEXTENDER_ATTATCHDEVICE,"y");
					//unsigned long ip = strIp.
					iTempCount++;
					if (1 == iTempCount && 1 == iDeviceCount)
					{
						mHelper->mMethod->mNodePool->nodeDetected(mHelper->mMethod,ip,mac,nodeinfoRef,ulIp,EXTENDER_STARTEND);
					}
					else if (1 == iTempCount && 1 != iDeviceCount)
					{
						mHelper->mMethod->mNodePool->nodeDetected(mHelper->mMethod,ip,mac,nodeinfoRef,ulIp,EXTENDER_START);
					}
					else if (1 < iTempCount && iTempCount != iDeviceCount)
					{
						mHelper->mMethod->mNodePool->nodeDetected(mHelper->mMethod,ip,mac,nodeinfoRef,ulIp,EXTENDER_MID);
					}
					else if (1 < iTempCount && iTempCount == iDeviceCount)
					{
						mHelper->mMethod->mNodePool->nodeDetected(mHelper->mMethod,ip,mac,nodeinfoRef,ulIp,EXTENDER_END);
					}
				}
			}
		}
	}
}
예제 #5
0
bool SVT_HttpDownload::getHttpFileProcess()
{
    QFile f(mLocalFile);
    QIODevice::OpenMode mode=(mStartPos>0)?(QIODevice::WriteOnly|QIODevice::Append):QIODevice::WriteOnly;
    if(!f.open(mode))
    {
        mErrorStr="Can Not Open Local File";
        return false;
    }
    QByteArray arraybuffer;
    QUrl url(mUrl);
    SVT_IpAddress ip = getDNS(url.host());
    if(!ip.isValid())
    {
        mErrorStr="DNS Error";
        return false;
    }

    SVT_TcpSocket tcp_sock;
    char recv_buff[1024] = {0};
    QString request = "GET %1 HTTP/1.1\r\nConnection: Keep-Alive\r\nHost: %2\r\nRange: bytes=%3-\r\n\r\n";

    request = request.arg(url.path(), url.host()).arg(mStartPos);
    const QByteArray reqarray = request.toAscii();
    _SpeedCalculater speedCalc(200);
    bool headOk=false;
    quint64 total=0;
    quint64 processed=0;

    if(DO_AND_CHECKEXIT(tcp_sock.create())
       &&DO_AND_CHECKEXIT(tcp_sock.connect(ip,url.port(80)))
       &&(DO_AND_CHECKEXIT(tcp_sock.waitForWriteReady(1000))
          ||DO_AND_CHECKEXIT(tcp_sock.waitForWriteReady(1000))
          ||DO_AND_CHECKEXIT(tcp_sock.waitForWriteReady(1000))
          ||DO_AND_CHECKEXIT(tcp_sock.waitForWriteReady(1000))

          )
       &&DO_AND_CHECKEXIT(reqarray.size()==tcp_sock.sendData(reqarray.data(),reqarray.size()) )
       )
    {
        QDateTime ti_last_signal=QDateTime::currentDateTime().addYears(-1);
        while(!CAN_EXIT)
        {
            int readedtemp ;
            if( (readedtemp= tcp_sock.recvData(recv_buff, sizeof(recv_buff)) ) <=0)
            {
                break;
            }
            if(!headOk)
            {
                arraybuffer.append(recv_buff,readedtemp);
                int bound=getHttpHeaderBound(arraybuffer);
                if(bound >=0)
                {
                    total=getRecvFileSize(arraybuffer);
                    arraybuffer.remove(0,bound);
                    f.write(arraybuffer);
                    processed=arraybuffer.count();
//                    if(total <= 0)
//                    {
//                        mErrorStr="Wrong Total Size";
//                        return false;
//                    }
                    speedCalc.init();
                    headOk=true;
                }
            }
            else
            {
                processed+=readedtemp;
                f.write(recv_buff,readedtemp);

                if(ti_last_signal.addMSecs(200) < QDateTime::currentDateTime())
                {
                    speedCalc.addData(processed);
                    ti_last_signal=QDateTime::currentDateTime();
                    emit progress(mStartPos+processed, total, speedCalc.calculateSpeed());
                }
            }
        }
    }
    f.close();
    return (!total ||total==processed);
}