資源簡介
在網上找了很久的資源,使用VC++實現的UDP穿透NAT的原理,里面包括p2pclient和p2pserver.經過本人的測試,可以當做很好的學習資料.注意:編譯p2pserver的時候,在125行 UserList::iterator removeiterator = NULL;和136行 if(removeiterator != NULL)有問題,將這段代碼注釋掉即可。

代碼片段和文件信息
/*?P2P?程序客戶端
?*?
?*?文件名:P2PClient.c
??*?Download:http://www.NewXing.com
?*?日期: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?sockchar?*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*)&remotesizeof(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?“< for(int?i?=?0;i {
stUserListNode?*node?=?new?stUserListNode;
recvfrom(sock?(char*)node?sizeof(stUserListNode)?0?(sockaddr?*)&remote?&fromlen);
ClientList.push_back(node);
cout<<“Username:“<userName< in_addr?tmp;
tmp.S_un.S_addr?=?htonl(node->ip);
cout<<“UserIP:“< cout<<“UserPort:“<port< cout<<““< }
}
void?OutputUsage()
{
cout<<“You?can?input?you?command:\n“
<<“Command?Type:\“send\“\“exit\“\“getu\“\n“
<<“Example?:?send?Username?Message\n“
<<“??????????exit\n“
<<“??????????getu\n“
< }
/
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????8736??2013-12-02?04:35??www.NewXing.com\UDP穿越NAT.TXT
?????文件????????530??2013-12-02?04:35??www.NewXing.com\Exception.h
?????文件???????1757??2013-12-02?04:35??www.NewXing.com\proto.h
?????文件???????9874??2013-12-02?04:35??www.NewXing.com\P2PClient\P2PClient.cpp
?????文件???????5396??2013-12-02?04:35??www.NewXing.com\P2PServer\P2PServer.cpp
????.......??????4324??2004-05-21?22:55??www.NewXing.com\P2PClient\P2PClient.dsp
????.......??????4320??2004-05-21?22:55??www.NewXing.com\P2PServer\P2PServer.dsp
????.......???????541??2004-05-21?21:55??www.NewXing.com\P2PClient\P2PClient.dsw
????.......???????541??2004-05-21?21:51??www.NewXing.com\P2PServer\P2PServer.dsw
????.......???????907??2004-05-22?08:47??www.NewXing.com\P2PClient\P2PClient.sln
????.......???????907??2004-05-22?08:47??www.NewXing.com\P2PServer\P2PServer.sln
????..A..H.??????8192??2004-05-22?09:24??www.NewXing.com\P2PClient\P2PClient.suo
????..A..H.??????8192??2004-05-22?09:24??www.NewXing.com\P2PServer\P2PServer.suo
????.......??????4361??2004-05-22?08:47??www.NewXing.com\P2PClient\P2PClient.vcproj
????.......??????4305??2004-05-22?08:47??www.NewXing.com\P2PServer\P2PServer.vcproj
?????目錄??????????0??2009-08-02?09:25??www.NewXing.com\P2PClient
?????目錄??????????0??2009-08-02?09:24??www.NewXing.com\P2PServer
-----------?---------??----------?-----??----
????????????????62883????????????????????17
- 上一篇:小學生計算機輔助教學系統控制結構程序設計
- 下一篇:高斯正反算代碼
評論
共有 條評論