//----------------------------------------------------------------------------- // 描述: 数据包首部初始化 // 参数: // nSeqNumberA - 为0时表示自动增长,否则直接赋值 //----------------------------------------------------------------------------- void CUdpPacketHeader::Init(uint nActionCodeA, uint nSeqNumberA,uint nOrderA) { ZeroBuffer(this, sizeof(CUdpPacketHeader)); nProtoType = PP_UDP; //包的协议 nActionCode = nActionCodeA; //包的动作代码 //包的序列号 if (nSeqNumberA == 0) nSeqNumber = Tracker.GetAllocator().AllocId() + 1; else nSeqNumber = nSeqNumberA; nOrder = nOrderA; nUserIp = StringToIp(GetLocalIp()); //用户IP wUdpPort = TrackerServer.GetLocalPort(); //UDP端口 wTcpPort = PeerTcpServer.GetLocalPort(); //TCP端口 char * UserName = Tracker.GetstrUserName(); char * UserPassword = Tracker.GetstrUserPassword(); strcpy(strUserName,UserName); strcpy(strUserPassword,UserPassword); UpdateCheckSum(); }
UINT ProxyServerThread(LPVOID info){ LPCLIENTINFO pclientinfo; SOCKET ClientSock,connectsock,listensock,newsock; sockaddr_in remotesock_addr,sock_addr,localsock_addr; char data[MAXDATALEN]; int datalen,methodlen,i,index; unsigned char CMD,ATYP; int DestPort,socklen; char ip[250]; struct in_addr ipaddr; pclientinfo=(LPCLIENTINFO)info; ClientSock=pclientinfo->clientsock; remotesock_addr=pclientinfo->remotesock; CString remoteip; ipaddr.S_un.S_addr=remotesock_addr.sin_addr.S_un.S_addr; remoteip.Format("%s",inet_ntoa(ipaddr)); TRACE(remoteip); TRACE(" connect ok...\r\n"); CString temp; datalen=recv(ClientSock,(char *)data,sizeof(data),0); if(datalen>2){ if(data[0]!=PROXYVERSION){ TRACE("remote server send data no socks5 \r\n"); SendMethodToClient(ClientSock,NOMETHOD); closesocket(ClientSock); return 1; } methodlen=data[1]; for(i=2;i<(methodlen+2);i++){ if(data[i]==NOAUTHLOGIN){ TRACE("send method ok!\r\n"); SendMethodToClient(ClientSock,NOAUTHLOGIN); break; } } } else{ TRACE("remote server send data wrong!\r\n"); SendMethodToClient(ClientSock,NOMETHOD); closesocket(ClientSock); return 1; } datalen=recv(ClientSock,(char *)data,sizeof(data),0); temp.Format("%d",datalen); TRACE(temp); if(datalen>=10){ TRACE("get cmd ok!"); CMD=data[1]; ATYP=(unsigned char)data[3]; switch(ATYP){ case ATYP_IPV4: memcpy((void *)&DestPort,(const void *)&data[8],2); //DestPort=110; ZeroMemory(ip,sizeof(ip)); wsprintf(ip,"%d.%d.%d.%d",(unsigned char)data[4],(unsigned char)data[5],(unsigned char)data[6],(unsigned char)data[7]); //strcpy(ip,"mail.sdu.edu.cn"); TRACE(ip); break; case ATYP_IPV6: DestPort=*(int *)&data[20]; SendRepToClient(ClientSock,REP_ATYP_WRONG,GetLocalIp(),0); closesocket(ClientSock); TRACE("ipv6 ok!\r\n"); return 0; break; case ATYP_DOMAIN: index=data[4]; memcpy((void *)&DestPort,&data[index+5],2); ZeroMemory(ip,sizeof(ip)); memcpy((void *)ip,(const void *)&data[5],index); ip[index]='\0'; TRACE(ip); break; default: SendRepToClient(ClientSock,REP_ATYP_WRONG,GetLocalIp(),0); TRACE("default ok!\r\n"); closesocket(ClientSock); return 0; break; } sock_addr.sin_family=AF_INET; sock_addr.sin_port=DestPort; if(ATYP==ATYP_DOMAIN) sock_addr.sin_addr.S_un.S_addr=GetDomainIp(ip); else sock_addr.sin_addr.S_un.S_addr=inet_addr(ip); localsock_addr.sin_family=AF_INET; localsock_addr.sin_port=htons(8001); localsock_addr.sin_addr.S_un.S_addr=INADDR_ANY; if(CMD==CMD_CONNECT){ TRACE("to connect remote ip...\r\n"); connectsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(connect(connectsock,(const sockaddr *)&sock_addr,sizeof(sock_addr))==INVALID_SOCKET){ SendRepToClient(ClientSock,REP_TTL_TIMEOUT,GetLocalIp(),0); closesocket(ClientSock); return 0; } socklen=sizeof(sock_addr); if(getsockname(connectsock,(sockaddr *)&sock_addr,&socklen)==SOCKET_ERROR) TRACE("get sock name err\r\n"); SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),ntohs(sock_addr.sin_port)); sockinfo.sourcesock=ClientSock; sockinfo.destsock=connectsock; TRACE("connect ok...\r\n"); AfxBeginThread(ReciveThread,(LPVOID)&sockinfo); AfxBeginThread(SendThread,(LPVOID)&sockinfo); //AfxBeginThread(DeailThread,(LPVOID)&sockinfo); } else if(CMD==CMD_BIND){ TRACE("to bind remote ip...\r\n"); listensock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(bind(listensock,(sockaddr *)&localsock_addr,sizeof(localsock_addr))==SOCKET_ERROR){ SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0); closesocket(ClientSock); TRACE("to bind remote failed...\r\n"); return 0; } listen(listensock,10); TRACE("to bind remote ok...\r\n"); SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),7895); newsock=accept(listensock,(sockaddr *)NULL,(int *)NULL); if(newsock==INVALID_SOCKET){ SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0); closesocket(ClientSock); TRACE("to accpet remote failed...\r\n"); return 0; } SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),7895); sockinfo.sourcesock=ClientSock; sockinfo.destsock=newsock; TRACE("accept ok...\r\n"); AfxBeginThread(ReciveThread,(LPVOID)&sockinfo); AfxBeginThread(SendThread,(LPVOID)&sockinfo); } else if(CMD==CMD_UDP){ TRACE("to udp remote ...\r\n"); TRACE("to bind remote ip...\r\n"); listensock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(bind(listensock,(sockaddr *)&localsock_addr,sizeof(localsock_addr))==SOCKET_ERROR){ SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0); closesocket(ClientSock); TRACE("to bind remote failed...\r\n"); return 0; } TRACE("to bind remote ok...\r\n"); SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),8001); UdpClientInfo.clientsock=ClientSock; UdpClientInfo.remotesock=sock_addr; UdpClientInfo.udpsock=listensock; TRACE("udp thread ok...\r\n"); AfxBeginThread(UdpDeailThread,(LPVOID)&UdpClientInfo); } else{ SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0); closesocket(ClientSock); return 0; } } return 1; }
/** * @ingroup SipSpeed * @brief SIP stack 을 시작한다. */ void CSipSpeedDlg::OnBnClickedStartSipStack() { // 입력값이 유효한지 검사한다. UpdateData(TRUE); if( CheckInput( m_strSipServerIp, "SIP Server IP" ) == false || CheckInput( m_strCallerId, "Caller ID" ) == false || CheckInput( m_strCalleeId, "Callee ID" ) == false ) { return; } if( m_strCallerId == m_strCalleeId ) { MessageBox( "CallerId is equal to CalleeId", "ID Error", MB_OK | MB_ICONERROR ); return; } // 유효하지 않는 입력값을 수정한다. if( m_strSipDomain.IsEmpty() ) m_strSipDomain = m_strSipServerIp; if( m_iSipServerPort <= 0 || m_iSipServerPort > 65535 ) m_iSipServerPort = 5060; if( m_iCallTotalCount <= 0 ) m_iCallTotalCount = 100; if( m_iCallConcurrentCount <= 0 ) m_iCallConcurrentCount = 10; UpdateData(FALSE); // 설정 파일에 저장한다. gclsSetup.m_strSipServerIp = m_strSipServerIp; gclsSetup.m_iSipServerPort = m_iSipServerPort; gclsSetup.m_strSipDomain = m_strSipDomain; gclsSetup.m_strCallerId = m_strCallerId; gclsSetup.m_strCallerPassWord = m_strCallerPassWord; gclsSetup.m_strCalleeId = m_strCalleeId; gclsSetup.m_strCalleePassWord = m_strCalleePassWord; gclsSetup.m_iCallTotalCount = m_iCallTotalCount; gclsSetup.m_iCallConcurrentCount = m_iCallConcurrentCount; gclsSetup.m_iTestType = m_iTestType; gclsSetup.Put(); // SipStack 을 시작한다. CSipStackSetup clsSetup; CSipServerInfo clsInfo; GetLocalIp( clsSetup.m_strLocalIp ); clsInfo.m_strIp = m_strSipServerIp; clsInfo.m_iPort = m_iSipServerPort; clsInfo.m_strDomain = m_strSipDomain; clsInfo.m_strUserId = m_strCallerId; clsInfo.m_strPassWord = m_strCallerPassWord; gclsSipUserAgent.InsertRegisterInfo( clsInfo ); clsInfo.m_strUserId = m_strCalleeId; clsInfo.m_strPassWord = m_strCalleePassWord; gclsSipUserAgent.InsertRegisterInfo( clsInfo ); bool bSuccess = false; clsSetup.m_iUdpThreadCount = 4; clsSetup.m_iStackExecutePeriod = 100; clsSetup.m_iTimerD = 4000; clsSetup.m_iTimerJ = 4000; for( int i = 0; i < 100; ++i ) { clsSetup.m_iLocalUdpPort = i + 10000; if( gclsSipUserAgent.Start( clsSetup, this ) ) { bSuccess = true; break; } } if( bSuccess == false ) { MessageBox( "sip stack start error", "Error", MB_OK ); return; } m_btnStartSipStack.EnableWindow( FALSE ); m_btnStopSipStack.EnableWindow( TRUE ); }