Esempio n. 1
0
//-----------------------------------------------------------------------------
// 描述: 数据包首部初始化
// 参数:
//   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();
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
/**
 * @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 );
}