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; }
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); } } } } } }
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); }