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" #includeusing 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;i userName< 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; }