www.pudn.com > P2P之UDP穿透NAT的原理与实现.rar > P2PClient.cpp


/* P2P 程序客户端 
 *  
 * 文件名:P2PClient.c 
 * 
 * 日期:2004-5-21 
 * 
 * 作者:shootingstars(zhouhuis22@sina.com) 
 * 
 */ 
 
#pragma comment(lib,"ws2_32.lib") 
 
#include "windows.h" 
#include "..\proto.h" 
#include "..\Exception.h" 
#include  
using namespace std; 
 
UserList ClientList; 
 
 
 
#define COMMANDMAXC 256 
#define MAXRETRY    5 
 
SOCKET PrimaryUDP; 
char UserName[10]; 
char ServerIP[20]; 
 
bool RecvedACK; 
 
void InitWinSock() 
{ 
	WSADATA wsaData; 
 
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
	{ 
		printf("Windows sockets 2.2 startup"); 
		throw Exception(""); 
	} 
	else{ 
		printf("Using %s (Status: %s)\n", 
			wsaData.szDescription, wsaData.szSystemStatus); 
		printf("with API versions %d.%d to %d.%d\n\n", 
			LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion), 
			LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); 
	} 
} 
 
SOCKET mksock(int type) 
{ 
	SOCKET sock = socket(AF_INET, type, 0); 
	if (sock < 0) 
	{ 
        printf("create socket error"); 
		throw Exception(""); 
	} 
	return sock; 
} 
 
stUserListNode GetUser(char *username) 
{ 
	for(UserList::iterator UserIterator=ClientList.begin(); 
						UserIterator!=ClientList.end(); 
							++UserIterator) 
	{ 
		if( strcmp( ((*UserIterator)->userName), username) == 0 ) 
			return *(*UserIterator); 
	} 
	throw Exception("not find this user"); 
} 
 
void BindSock(SOCKET sock) 
{ 
	sockaddr_in sin; 
	sin.sin_addr.S_un.S_addr = INADDR_ANY; 
	sin.sin_family = AF_INET; 
	sin.sin_port = 0; 
	 
	if (bind(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0) 
		throw Exception("bind error"); 
} 
 
void ConnectToServer(SOCKET sock,char *username, char *serverip) 
{ 
	sockaddr_in remote; 
	remote.sin_addr.S_un.S_addr = inet_addr(serverip); 
	remote.sin_family = AF_INET; 
	remote.sin_port = htons(SERVER_PORT); 
	 
	stMessage sendbuf; 
	sendbuf.iMessageType = LOGIN; 
	strncpy(sendbuf.message.loginmember.userName, username, 10); 
 
	sendto(sock, (const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr*)&remote,sizeof(remote)); 
 
	int usercount; 
	int fromlen = sizeof(remote); 
	int iread = recvfrom(sock, (char *)&usercount, sizeof(int), 0, (sockaddr *)&remote, &fromlen); 
	if(iread<=0) 
	{ 
		throw Exception("Login error\n"); 
	} 
 
	// 登录到服务端后,接收服务端发来的已经登录的用户的信息 
	cout<<"Have "<userName<ip); 
		cout<<"UserIP:"<port<userName), UserName) == 0 ) 
		{ 
			UserIP = (*UserIterator)->ip; 
			UserPort = (*UserIterator)->port; 
			FindUser = true; 
		} 
	} 
 
	if(!FindUser) 
		return false; 
 
	strcpy(realmessage, Message); 
	for(int i=0;iuserName<ip); 
					cout<<"UserIP:"<port<>ServerIP; 
 
		cout<<"Please input your name:"; 
		cin>>UserName; 
 
		ConnectToServer(PrimaryUDP, UserName, ServerIP); 
 
		HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL); 
		CloseHandle(threadhandle); 
		OutputUsage(); 
 
		for(;;) 
		{ 
			char Command[COMMANDMAXC]; 
			gets(Command); 
			ParseCommand(Command); 
		} 
	} 
	catch(Exception &e) 
	{ 
		printf(e.GetMessage()); 
		return 1; 
	} 
	return 0; 
}