资源简介
在网上找了很久的资源,使用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
- 上一篇:小学生计算机辅助教学系统控制结构程序设计
- 下一篇:高斯正反算代码
相关资源
- VC++ 多线程文件读写操作
- 移木块游戏,可以自编自玩,vc6.0编写
- VC++MFC小游戏实例教程(实例)+MFC类库
- VC++实现CMD命令执行与获得返回信息
- libnet发送udp和tcp包
- VC++基于OpenGL模拟的一个3维空间模型
- 基于VC++的SolidWorks二次开发SolidWorks
- 派克变换VC++源码(附文档)
- VC++ 串口
- VC++ 大富翁4_大富翁游戏源码
- MFC UDP编程
- VC++ 摄像头视频采集与回放源程序
- 转 VC++ 实现电子邮件(Email)发送
- 基于MFC的VC++仿QQ浏览器源码(雏形)
- VC++ 服务程序编写及安装与卸载
- VC++6.0番茄西红柿VAXvirsual assist X完美破
- 基于改进的fcm算法的图像分割vc++
- VC++6.0 绿色版,免安装,非常好用。
- Microsoft Visual C++ 2005 Redistributable Pack
- VC++MFC课程设计的学生成绩管理系统
- 大智慧365DLL插件设计
- VC++6.0汉化包
- VC++完整商业界面源码(再上传)
- VC++编程技术600个大型项目源码.rar
- VC++实现RSA加密算法
- VC++ 中国象棋经典游戏源代码
- 郁金香VC++游戏辅助视频教程
- C语言进阶源码---基于graphics实现图书
- 摄影测量相对定向VC++程序
- VC++数字图像处理典型算法及实现
川公网安备 51152502000135号
评论
共有 条评论