锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久66热人妻偷产精品9,久久国产免费观看精品3,久久永久免费人妻精品下载http://www.shnenglu.com/shenhuafeng/category/2582.html(STL,Templete,Generric Programming COM,COM+,ActiveX)---Windows && Linux &&OpenSource zh-cnWed, 21 May 2008 21:14:47 GMTWed, 21 May 2008 21:14:47 GMT60淇敼tcpip.sys,鐮撮櫎winxp鐨?0涓綉緇滆繛鎺ラ檺鍒?杞?http://www.shnenglu.com/shenhuafeng/archive/2007/02/25/18963.htmlCPP&&璁捐妯″紡灝忓眿CPP&&璁捐妯″紡灝忓眿Sun, 25 Feb 2007 06:29:00 GMThttp://www.shnenglu.com/shenhuafeng/archive/2007/02/25/18963.htmlhttp://www.shnenglu.com/shenhuafeng/comments/18963.htmlhttp://www.shnenglu.com/shenhuafeng/archive/2007/02/25/18963.html#Feedback1http://www.shnenglu.com/shenhuafeng/comments/commentRss/18963.htmlhttp://www.shnenglu.com/shenhuafeng/services/trackbacks/18963.html闃呰鍏ㄦ枃

CPP&&璁捐妯″紡灝忓眿 2007-02-25 14:29 鍙戣〃璇勮
]]>
WinSocket妯″瀷鐨勬帰璁ㄢ斺攕elect妯″瀷錛堣漿 鏀惰棌錛?/title><link>http://www.shnenglu.com/shenhuafeng/archive/2007/01/19/17788.html</link><dc:creator>CPP&&璁捐妯″紡灝忓眿</dc:creator><author>CPP&&璁捐妯″紡灝忓眿</author><pubDate>Fri, 19 Jan 2007 08:44:00 GMT</pubDate><guid>http://www.shnenglu.com/shenhuafeng/archive/2007/01/19/17788.html</guid><wfw:comment>http://www.shnenglu.com/shenhuafeng/comments/17788.html</wfw:comment><comments>http://www.shnenglu.com/shenhuafeng/archive/2007/01/19/17788.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/shenhuafeng/comments/commentRss/17788.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shenhuafeng/services/trackbacks/17788.html</trackback:ping><description><![CDATA[     鎽樿: 杞創鑷細http://blog.csdn.net/dylgsy/鏌ユ壘浜嗗緢澶氳祫鏂欓兘鎵句笉鍒皊elect妯″瀷鐨勮緇嗙敤娉曪紝銆奧indows緗戠粶緙栫▼銆嬭繖鏈功涓婁篃鍙槸鍐欎簡涓涓畝鍗曠殑鍥炲簲鏈嶅姟鍣紝灝辮繛writefds鐨勭敤娉曢兘娌¤錛屼篃涓嶇煡閬撲粈涔堟椂鍊欏埄鐢ㄢ滃彲鍐欌濇潵鍙戞枃浠躲傝繖浜涢兘鏄垜鐨勭枒闂紝鐩鎬俊寰堝鐮旂┒緗戠粶緙栫▼鐨勫悓璺漢涔熺鍒頒簡鎴戠殑榪欎簺闂銆傝繖浜涚枒闂湪榪欑瘒鏂囩珷涓兘瑙e喅浜嗭紒鑰楄垂浜嗗伓寰堝鐨勭簿鍔涘幓鐚滄祴鍘繪濊冿紒聽 鎰熻涓浜?..  <a href='http://www.shnenglu.com/shenhuafeng/archive/2007/01/19/17788.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/shenhuafeng/aggbug/17788.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shenhuafeng/" target="_blank">CPP&&璁捐妯″紡灝忓眿</a> 2007-01-19 16:44 <a href="http://www.shnenglu.com/shenhuafeng/archive/2007/01/19/17788.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>寰蔣ping紼嬪簭婧愪唬鐮佸畬鏁寸増(杞?http://www.shnenglu.com/shenhuafeng/archive/2007/01/05/17312.htmlCPP&&璁捐妯″紡灝忓眿CPP&&璁捐妯″紡灝忓眿Fri, 05 Jan 2007 05:46:00 GMThttp://www.shnenglu.com/shenhuafeng/archive/2007/01/05/17312.htmlhttp://www.shnenglu.com/shenhuafeng/comments/17312.htmlhttp://www.shnenglu.com/shenhuafeng/archive/2007/01/05/17312.html#Feedback0http://www.shnenglu.com/shenhuafeng/comments/commentRss/17312.htmlhttp://www.shnenglu.com/shenhuafeng/services/trackbacks/17312.html

浣滆?渚織姹?/p>

緙栧啓鑷繁鐨勪竴涓猵ing紼嬪簭,鍙互璇存槸璁稿浜鴻繄鍑虹綉緇滅紪紼嬬殑絎竴姝ュ惂!!榪欎釜ping紼嬪簭鐨勬簮浠g爜緇忚繃鎴戠殑淇敼鍜岃皟璇?鍩烘湰涓婂彲浠ュ彇浠indows涓嚜甯︾殑ping紼嬪簭. 鍚勪釜妯″潡鍚庨兘鏈夋垜鐨勮緇嗘敞閲婂拰淇敼鏃ュ織,甯屾湜鑳藉瀵瑰ぇ瀹剁殑瀛︿範鏈夋墍甯姪!!

/*聽 鏈▼搴忕殑涓昏婧愪唬鐮佹潵鑷狹SDN緗戠珯, 絎旇呭彧鏄仛浜嗕竴浜涙敼榪涘拰娉ㄩ噴! 鍙﹀闇瑕佹敞鎰忕殑鏄湪Build涔嬪墠,蹇呴』鍔犲叆ws2_32.lib搴撴枃浠?鍚﹀垯浼氭彁紺?error LNK2001:"鐨勯敊璇紒*/

/******************************************************************************\
| Version 1.1 淇敼璁板綍:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |
|聽聽聽 <1> 瑙e喅浜唖ocket闃誨鐨勯棶棰?浠庤岃兘澶熸紜湴澶勭悊瓚呮椂鐨勮姹?聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |
|----------------------------------------------------------------------------------------------------|
| Version 1.2 淇敼璁板綍:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |
|聽聽聽 <1> 澧炲姞浜嗙敱鐢ㄦ埛鎺у埗鍙戦両CMP鍖呯殑鏁扮洰鐨勫姛鑳?鍗沖懡浠ょ殑絎簩涓弬鏁?.聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |聽聽聽
|聽聽聽 <2> 澧炲姞浜嗗ping緇撴灉鐨勭粺璁″姛鑳?聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |
\******************************************************************************/

#pragma pack(4)

#include
#include
#include

#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0

#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

/* The IP header */
typedef struct iphdr {
unsigned int h_len:4; // length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // total length of the packet
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl;
unsigned char proto; // protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum

unsigned int sourceIP;
unsigned int destIP;

}IpHeader;

//
// ICMP header
//
typedef struct icmphdr {
BYTE i_type;
BYTE i_code; /* type sub code */
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
/* This is not the std header, but we reserve space for time */
ULONG timestamp;
}IcmpHeader;

#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE聽聽聽 32
#define DEF_PACKET_NUMBER聽 4聽聽聽 /* 鍙戦佹暟鎹姤鐨勪釜鏁?*/
#define MAX_PACKET 1024

#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree (GetProcessHeap(),0,(p))

void fill_icmp_data(char *, int);
USHORT checksum(USHORT *, int);
int decode_resp(char *,int ,struct sockaddr_in *);

void Usage(char *progname){

fprintf(stderr,"Usage:\n");
fprintf(stderr,"%s [number of packets] [data_size]\n",progname);
fprintf(stderr,"datasize can be up to 1Kb\n");
ExitProcess(STATUS_FAILED);

}
int main(int argc, char **argv){

WSADATA wsaData;
SOCKET sockRaw;
struct sockaddr_in dest,from;
struct hostent * hp;
int bread,datasize,times;
int fromlen = sizeof(from);
int timeout = 1000;
int statistic = 0;聽 /* 鐢ㄤ簬緇熻緇撴灉 */聽
char *dest_ip;
char *icmp_data;
char *recvbuf;
unsigned int addr=0;
USHORT seq_no = 0;

if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
ExitProcess(STATUS_FAILED);
}

if (argc <2 ) {
Usage(argv[0]);
}
sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED);

//
//娉細涓轟簡浣跨敤鍙戦佹帴鏀惰秴鏃惰緗?鍗寵緗甋O_RCVTIMEO, SO_SNDTIMEO)錛?
//聽聽聽 蹇呴』灝嗘爣蹇椾綅璁句負WSA_FLAG_OVERLAPPED !
//

if (sockRaw == INVALID_SOCKET) {
fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,
sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
timeout = 1000;
bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,
sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
memset(&dest,0,sizeof(dest));

hp = gethostbyname(argv[1]);

if (!hp){
addr = inet_addr(argv[1]);
}
if ((!hp) && (addr == INADDR_NONE) ) {
fprintf(stderr,"Unable to resolve %s\n",argv[1]);
ExitProcess(STATUS_FAILED);
}

if (hp != NULL)
memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length);
else
dest.sin_addr.s_addr = addr;

if (hp)
dest.sin_family = hp->h_addrtype;
else
dest.sin_family = AF_INET;

dest_ip = inet_ntoa(dest.sin_addr);

//
//聽 atoi鍑芥暟鍘熷瀷鏄? int atoi( const char *string );
//聽 The return value is 0 if the input cannot be converted to an integer !
//
if(argc>2)
{
聽times=atoi(argv[2]);
聽if(times == 0)
聽 times=DEF_PACKET_NUMBER;
}
else
聽聽聽 times=DEF_PACKET_NUMBER;

if (argc >3)
{
聽datasize = atoi(argv[3]);
聽聽聽 if (datasize == 0)
聽聽聽聽聽聽聽 datasize = DEF_PACKET_SIZE;
聽if (datasize >1024)聽聽 /* 鐢ㄦ埛緇欏嚭鐨勬暟鎹寘澶у皬澶ぇ */
聽{
聽 fprintf(stderr,"WARNING : data_size is too large !\n");
聽 datasize = DEF_PACKET_SIZE;
聽}
}
else
聽聽聽 datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

icmp_data = (char*)xmalloc(MAX_PACKET);
recvbuf = (char*)xmalloc(MAX_PACKET);

if (!icmp_data) {
fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());
ExitProcess(STATUS_FAILED);
}


memset(icmp_data,0,MAX_PACKET);
fill_icmp_data(icmp_data,datasize);

//
//鏄劇ず鎻愮ず淇℃伅
//
fprintf(stdout,"\nPinging %s ....\n\n",dest_ip);


for(int i=0;i{
int bwrote;

((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();

((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize);

bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));
if (bwrote == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.\n");
continue;
}
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
if (bwrote < datasize ) {
fprintf(stdout,"Wrote %d bytes\n",bwrote);
}
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
if (bread == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.\n");
continue;
}
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
if(!decode_resp(recvbuf,bread,&from))
聽statistic++; /* 鎴愬姛鎺ユ敹鐨勬暟鐩?+ */
Sleep(1000);

}

/*
Display the statistic result
*/
fprintf(stdout,"\nPing statistics for %s \n",dest_ip);
fprintf(stdout,"聽聽聽 Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",times,
聽聽聽聽 statistic,(times-statistic),(float)(times-statistic)/times*100);


WSACleanup();
return 0;

}
/*
The response is an IP packet. We must decode the IP header to locate
the ICMP data
*/
int decode_resp(char *buf, int bytes,struct sockaddr_in *from) {

IpHeader *iphdr;
IcmpHeader *icmphdr;
unsigned short iphdrlen;

iphdr = (IpHeader *)buf;

iphdrlen = (iphdr->h_len) * 4 ; // number of 32-bit words *4 = bytes

if (bytes < iphdrlen + ICMP_MIN) {
printf("Too few bytes from %s\n",inet_ntoa(from->sin_addr));
}

icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr->i_type != ICMP_ECHOREPLY) {
fprintf(stderr,"non-echo type %d recvd\n",icmphdr->i_type);
return 1;
}
if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {
fprintf(stderr,"someone else's packet!\n");
return 1;
}
printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr));
printf(" icmp_seq = %d. ",icmphdr->i_seq);
printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp);
printf("\n");
return 0;

}


USHORT checksum(USHORT *buffer, int size) {

unsigned long cksum=0;

while(size >1) {
cksum+=*buffer++;
size -=sizeof(USHORT);
}

if(size) {
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
/*
Helper function to fill in various stuff in our ICMP request.
*/
void fill_icmp_data(char * icmp_data, int datasize){

IcmpHeader *icmp_hdr;
char *datapart;

icmp_hdr = (IcmpHeader*)icmp_data;

icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader);
//
// Place some junk in the buffer.
//
memset(datapart,'E', datasize - sizeof(IcmpHeader));

}

/******************* 闄? ping鍛戒護鎵ц鏃舵樉紺虹殑鐢婚潰 ***************\
*聽 C:\Documents and Settings\houzhijiang>ping 236.56.54.12聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Pinging 236.56.54.12 with 32 bytes of data:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Request timed out.聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Request timed out.聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Request timed out.聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Request timed out.聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Ping statistics for 236.56.54.12:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽 Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
\*********************************************************/

/*********************************************************\
*聽 C:\Documents and Settings\houzhijiang>ping 127.0.0.1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Pinging 127.0.0.1 with 32 bytes of data:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Reply from 127.0.0.1: bytes=32 time<1ms TTL=128聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Ping statistics for 127.0.0.1:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽 Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽 Approximate round trip times in milli-seconds:聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽 Minimum = 0ms, Maximum = 0ms, Average = 0ms聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
*聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 *
\********************************************************/



CPP&&璁捐妯″紡灝忓眿 2007-01-05 13:46 鍙戣〃璇勮
]]>
P2P涔婾DP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級錛堣漿錛?/title><link>http://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17215.html</link><dc:creator>CPP&&璁捐妯″紡灝忓眿</dc:creator><author>CPP&&璁捐妯″紡灝忓眿</author><pubDate>Thu, 04 Jan 2007 05:37:00 GMT</pubDate><guid>http://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17215.html</guid><wfw:comment>http://www.shnenglu.com/shenhuafeng/comments/17215.html</wfw:comment><comments>http://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shenhuafeng/comments/commentRss/17215.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shenhuafeng/services/trackbacks/17215.html</trackback:ping><description><![CDATA[ <div align="center"> <h1 class="aTitle">P2P涔婾DP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級</h1> </div> <table width="97%" align="center"> <tbody> <tr> <td align="middle">浣滆咃細<span id="AuthorLabel">shootingstars</span> | 鏃ユ湡錛?span id="TimeLabel">2004-05-25</span> | 瀛椾綋錛?a href="javascript:ContentSize(16)">澶?/a><a href="javascript:ContentSize(14)">涓?/a><a href="javascript:ContentSize(12)">灝?/a></td> </tr> </tbody> </table> <div id="5z5prrb" class="content" id="BodyLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"> <p>P2P 涔?UDP絀塊廚AT鐨勫師鐞嗕笌瀹炵幇錛堥檮婧愪唬鐮侊級<br />鍘熷垱錛歴hootingstars<br />鍙傝冿細<a >http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt</a><!--IWMS_AD_BEGIN--></p> <div style="FLOAT: right; WIDTH: 350px"> <script src="ads/show350_250.js" type="text/javascript"> </script> </div> <!--IWMS_AD_END--> <p> </p> <p>璁哄潧涓婄粡甯告湁瀵筆2P鍘熺悊鐨勮璁猴紝浣嗘槸璁ㄨ褰掕璁猴紝寰堝皯鏈夊疄璐ㄧ殑涓滆タ浜х敓錛堟簮浠g爜錛夈傚懙鍛碉紝鍦ㄨ繖閲屾垜灝辯敤鑷繁瀹炵幇鐨勪竴涓簮浠g爜鏉ヨ鏄嶶DP絀胯秺NAT鐨勫師鐞嗐?/p> <p>棣栧厛鍏堜粙緇嶄竴浜涘熀鏈蹇碉細<br />聽聽聽 NAT(Network Address Translators)錛岀綉緇滃湴鍧杞崲錛氱綉緇滃湴鍧杞崲鏄湪IP鍦板潃鏃ョ泭緙轟箯鐨勬儏鍐典笅浜х敓鐨勶紝瀹冪殑涓昏鐩殑灝辨槸涓轟簡鑳藉鍦板潃閲嶇敤銆侼AT鍒嗕負涓ゅぇ綾伙紝鍩烘湰鐨凬AT鍜孨APT(Network Address/Port Translator)銆?br />聽聽聽 鏈寮濮婲AT鏄繍琛屽湪璺敱鍣ㄤ笂鐨勪竴涓姛鑳芥ā鍧椼?br />聽聽聽 <br />聽聽聽 鏈鍏堟彁鍑虹殑鏄熀鏈殑NAT錛屽畠鐨勪駭鐢熷熀浜庡涓嬩簨瀹烇細涓涓鏈夌綉緇滐紙鍩燂級涓殑鑺傜偣涓彧鏈夊緢灝戠殑鑺傜偣闇瑕佷笌澶栫綉榪炴帴錛堝懙鍛碉紝榪欐槸鍦ㄤ笂涓栫邯90騫翠唬涓湡鎻愬嚭鐨勶級銆傞偅涔堣繖涓瓙緗戜腑鍏跺疄鍙湁灝戞暟鐨勮妭鐐歸渶瑕佸叏鐞冨敮涓鐨処P鍦板潃錛屽叾浠栫殑鑺傜偣鐨処P鍦板潃搴旇鏄彲浠ラ噸鐢ㄧ殑銆?br />聽聽聽 鍥犳錛屽熀鏈殑NAT瀹炵幇鐨勫姛鑳藉緢綆鍗曪紝鍦ㄥ瓙緗戝唴浣跨敤涓涓繚鐣欑殑IP瀛愮綉孌碉紝榪欎簺IP瀵瑰鏄笉鍙鐨勩傚瓙緗戝唴鍙湁灝戞暟涓浜汭P鍦板潃鍙互瀵瑰簲鍒扮湡姝e叏鐞冨敮涓鐨処P鍦板潃銆傚鏋滆繖浜涜妭鐐歸渶瑕佽闂閮ㄧ綉緇滐紝閭d箞鍩烘湰NAT灝辮礋璐e皢榪欎釜鑺傜偣鐨勫瓙緗戝唴IP杞寲涓轟竴涓叏鐞冨敮涓鐨処P鐒跺悗鍙戦佸嚭鍘匯?鍩烘湰鐨凬AT浼氭敼鍙業P鍖呬腑鐨勫師IP鍦板潃錛屼絾鏄笉浼氭敼鍙業P鍖呬腑鐨勭鍙?<br />聽聽聽 鍏充簬鍩烘湰鐨凬AT鍙互鍙傜湅RFC 1631<br />聽聽聽 <br />聽聽聽 鍙﹀涓縐峃AT鍙仛NAPT錛屼粠鍚嶇О涓婃垜浠篃鍙互鐪嬪緱鍑猴紝NAPT涓嶄絾浼氭敼鍙樼粡榪囪繖涓狽AT璁懼鐨処P鏁版嵁鎶ョ殑IP鍦板潃錛岃繕浼氭敼鍙業P鏁版嵁鎶ョ殑TCP/UDP绔彛銆傚熀鏈琋AT鐨勮澶囧彲鑳芥垜浠鐨勪笉澶氾紙鍛靛懙錛屾垜娌℃湁瑙佸埌榪囷級錛孨APT鎵嶆槸鎴戜滑鐪熸璁ㄨ鐨勪富瑙掋傜湅涓嬪浘錛?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Server S1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 18.181.0.31:1235聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽 ^聽 Session 1 (A-S1)聽 ^聽聽聽聽聽 |聽 <br />聽聽聽聽聽聽聽聽聽 |聽 18.181.0.31:1235聽 |聽聽聽聽聽 |聽聽 <br />聽聽聽聽聽聽聽聽聽 v 155.99.25.11:62000 v聽聽聽聽聽 |聽聽聽 <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 NAT<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 155.99.25.11<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽 ^聽 Session 1 (A-S1)聽 ^聽聽聽聽聽 |聽 <br />聽聽聽聽聽聽聽聽聽 |聽 18.181.0.31:1235聽 |聽聽聽聽聽 |聽 <br />聽聽聽聽聽聽聽聽聽 v聽聽 10.0.0.1:1234聽聽聽 v聽聽聽聽聽 |聽 <br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Client A<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 10.0.0.1:1234<br />聽聽聽 鏈変竴涓鏈夌綉緇?0.*.*.*錛孋lient A鏄叾涓殑涓鍙拌綆楁満錛岃繖涓綉緇滅殑緗戝叧錛堜竴涓狽AT璁懼錛夌殑澶栫綉IP鏄?55.99.25.11(搴旇榪樻湁涓涓唴緗戠殑IP鍦板潃錛屾瘮濡?0.0.0.10)銆傚鏋淐lient A涓殑鏌愪釜榪涚▼錛堣繖涓繘紼嬪垱寤轟簡涓涓猆DP Socket,榪欎釜Socket緇戝畾1234绔彛錛夋兂璁塊棶澶栫綉涓繪満18.181.0.31鐨?235绔彛錛岄偅涔堝綋鏁版嵁鍖呴氳繃NAT鏃朵細鍙戠敓浠涔堜簨鎯呭憿錛?br />聽聽聽 棣栧厛NAT浼氭敼鍙樿繖涓暟鎹寘鐨勫師IP鍦板潃錛屾敼涓?55.99.25.11銆傛帴鐫NAT浼氫負榪欎釜浼犺緭鍒涘緩涓涓猄ession錛圫ession鏄竴涓娊璞$殑姒傚康錛屽鏋滄槸TCP錛屼篃璁窼ession鏄敱涓涓猄YN鍖呭紑濮嬶紝浠ヤ竴涓狥IN鍖呯粨鏉熴傝孶DP鍛紝浠ヨ繖涓狪P鐨勮繖涓鍙g殑絎竴涓猆DP寮濮嬶紝緇撴潫鍛紝鍛靛懙錛屼篃璁告槸鍑犲垎閽燂紝涔熻鏄嚑灝忔椂錛岃繖瑕佺湅鍏蜂綋鐨勫疄鐜頒簡錛夊茍涓旂粰榪欎釜Session鍒嗛厤涓涓鍙o紝姣斿62000錛岀劧鍚庢敼鍙樿繖涓暟鎹寘鐨勬簮绔彛涓?2000銆傛墍浠ユ湰鏉ユ槸錛?0.0.0.1:1234->18.181.0.31:1235錛夌殑鏁版嵁鍖呭埌浜嗕簰鑱旂綉涓婂彉涓轟簡錛?55.99.25.11:62000->18.181.0.31:1235錛夈?br />聽聽聽 涓鏃AT鍒涘緩浜嗕竴涓猄ession鍚庯紝NAT浼氳浣?2000绔彛瀵瑰簲鐨勬槸10.0.0.1鐨?234绔彛錛屼互鍚庝粠18.181.0.31鍙戦佸埌62000绔彛鐨勬暟鎹細琚玁AT鑷姩鐨勮漿鍙戝埌10.0.0.1涓娿傦紙娉ㄦ剰錛氳繖閲屾槸璇?8.181.0.31鍙戦佸埌62000绔彛鐨勬暟鎹細琚漿鍙戯紝鍏朵粬鐨処P鍙戦佸埌榪欎釜绔彛鐨勬暟鎹皢琚玁AT鎶涘純錛夎繖鏍稢lient A灝變笌Server S1寤虹珛浠ヤ簡涓涓繛鎺ャ?/p> <p>聽聽聽 鍛靛懙錛屼笂闈㈢殑鍩虹鐭ヨ瘑鍙兘寰堝浜洪兘鐭ラ亾浜嗭紝閭d箞涓嬮潰鏄叧閿殑閮ㄥ垎浜嗐?br />聽聽聽 鐪嬬湅涓嬮潰鐨勬儏鍐碉細<br />聽聽聽 Server S1聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Server S2<br />聽18.181.0.31:1235聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 138.76.29.7:1235<br />聽聽聽聽聽聽聽 |聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽 |聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽 +----------------------+----------------------+<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽 ^聽 Session 1 (A-S1)聽 ^聽聽聽聽聽 |聽聽聽聽聽 ^聽 Session 2 (A-S2)聽 ^<br />聽聽 |聽 18.181.0.31:1235聽 |聽聽聽聽聽 |聽聽聽聽聽 |聽 138.76.29.7:1235聽 |<br />聽聽 v 155.99.25.11:62000 v聽聽聽聽聽 |聽聽聽聽聽 v 155.99.25.11:62000 v<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Cone NAT<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 155.99.25.11<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽 ^聽 Session 1 (A-S1)聽 ^聽聽聽聽聽 |聽聽聽聽聽 ^聽 Session 2 (A-S2)聽 ^<br />聽聽 |聽 18.181.0.31:1235聽 |聽聽聽聽聽 |聽聽聽聽聽 |聽 138.76.29.7:1235聽 |<br />聽聽 v聽聽 10.0.0.1:1234聽聽聽 v聽聽聽聽聽 |聽聽聽聽聽 v聽聽 10.0.0.1:1234聽聽聽 v<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Client A<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 10.0.0.1:1234<br />聽聽聽 鎺ヤ笂闈㈢殑渚嬪瓙錛屽鏋淐lient A鐨勫師鏉ラ偅涓猄ocket(緇戝畾浜?234绔彛鐨勯偅涓猆DP Socket)鍙堟帴鐫鍚戝彟澶栦竴涓猄erver S2鍙戦佷簡涓涓猆DP鍖咃紝閭d箞榪欎釜UDP鍖呭湪閫氳繃NAT鏃朵細鎬庝箞鏍峰憿錛?br />聽聽聽 榪欐椂鍙兘浼氭湁涓ょ鎯呭喌鍙戠敓錛屼竴縐嶆槸NAT鍐嶆鍒涘緩涓涓猄ession錛屽茍涓斿啀嬈′負榪欎釜Session鍒嗛厤涓涓鍙e彿錛堟瘮濡傦細62001錛夈傚彟澶栦竴縐嶆槸NAT鍐嶆鍒涘緩涓涓猄ession錛屼絾鏄笉浼氭柊鍒嗛厤涓涓鍙e彿錛岃屾槸鐢ㄥ師鏉ュ垎閰嶇殑绔彛鍙?2000銆傚墠涓縐峃AT鍙仛Symmetric NAT錛屽悗涓縐嶅彨鍋欳one NAT銆傛垜浠湡鏈涙垜浠殑NAT鏄浜岀錛屽懙鍛碉紝濡傛灉浣犵殑NAT鍒氬ソ鏄涓縐嶏紝閭d箞寰堝彲鑳戒細鏈夊緢澶歅2P杞歡澶辯伒銆傦紙鍙互搴嗗垢鐨勬槸錛岀幇鍦ㄧ粷澶у鏁扮殑NAT灞炰簬鍚庤咃紝鍗矯one NAT錛?br />聽聽 <br />聽聽聽 濂戒簡錛屾垜浠湅鍒幫紝閫氳繃NAT,瀛愮綉鍐呯殑璁$畻鏈哄悜澶栬繛緇撴槸寰堝鏄撶殑錛圢AT鐩稿綋浜庨忔槑鐨勶紝瀛愮綉鍐呯殑鍜屽緗戠殑璁$畻鏈轟笉鐢ㄧ煡閬揘AT鐨勬儏鍐碉級銆?br />聽聽聽 浣嗘槸濡傛灉澶栭儴鐨勮綆楁満鎯寵闂瓙緗戝唴鐨勮綆楁満灝辨瘮杈冨洶闅句簡錛堣岃繖姝f槸P2P鎵闇瑕佺殑錛夈?br />聽聽聽 閭d箞鎴戜滑濡傛灉鎯充粠澶栭儴鍙戦佷竴涓暟鎹姤緇欏唴緗戠殑璁$畻鏈烘湁浠涔堝姙娉曞憿錛熼鍏堬紝鎴戜滑蹇呴』鍦ㄥ唴緗戠殑NAT涓婃墦涓婁竴涓滄礊鈥濓紙涔熷氨鏄墠闈㈡垜浠鐨勫湪NAT涓婂緩绔嬩竴涓猄ession錛夛紝榪欎釜媧炰笉鑳界敱澶栭儴鏉ユ墦錛屽彧鑳界敱鍐呯綉鍐呯殑涓繪満鏉ユ墦銆傝屼笖榪欎釜媧炴槸鏈夋柟鍚戠殑錛屾瘮濡備粠鍐呴儴鏌愬彴涓繪満錛堟瘮濡傦細192.168.0.10錛夊悜澶栭儴鐨勬煇涓狪P(姣斿錛?19.237.60.1)鍙戦佷竴涓猆DP鍖咃紝閭d箞灝卞湪榪欎釜鍐呯綉鐨凬AT璁懼涓婃墦浜嗕竴涓柟鍚戜負219.237.60.1鐨勨滄礊鈥濓紝錛堣繖灝辨槸縐頒負UDP Hole Punching鐨勬妧鏈級浠ュ悗219.237.60.1灝卞彲浠ラ氳繃榪欎釜媧炰笌鍐呯綉鐨?92.168.0.10鑱旂郴浜嗐傦紙浣嗘槸鍏朵粬鐨処P涓嶈兘鍒╃敤榪欎釜媧烇級銆?/p> <p>鍛靛懙錛岀幇鍦ㄨ杞埌鎴戜滑鐨勬棰楶2P浜嗐傛湁浜嗕笂闈㈢殑鐞嗚錛屽疄鐜頒袱涓唴緗戠殑涓繪満閫氳灝卞樊鏈鍚庝竴姝ヤ簡錛氶偅灝辨槸楦$敓铔嬭繕鏄泲鐢熼浮鐨勯棶棰樹簡錛屼袱杈歸兘鏃犳硶涓誨姩鍙戝嚭榪炴帴璇鋒眰錛岃皝涔熶笉鐭ラ亾璋佺殑鍏綉鍦板潃錛岄偅鎴戜滑濡備綍鏉ユ墦榪欎釜媧炲憿錛熸垜浠渶瑕佷竴涓腑闂翠漢鏉ヨ仈緋昏繖涓や釜鍐呯綉涓繪満銆?br />聽聽聽 鐜板湪鎴戜滑鏉ョ湅鐪嬩竴涓狿2P杞歡鐨勬祦紼嬶紝浠ヤ笅鍥句負渚嬶細</p> <p>聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Server S 錛?19.237.60.1錛?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽聽 +----------------------+----------------------+<br />聽聽 |聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />聽NAT A (澶栫綉IP:202.187.45.3)聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 NAT B (澶栫綉IP:187.34.1.56)<br />聽聽 |聽聽 (鍐呯綉IP:192.168.0.1)聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 | (鍐呯綉IP:192.168.0.1)<br />聽聽 |聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 |<br />Client A聽 (192.168.0.20:4000)聽聽聽聽聽聽聽聽聽聽聽聽 Client B (192.168.0.10:40000)</p> <p>聽聽聽 棣栧厛錛孋lient A鐧誨綍鏈嶅姟鍣紝NAT A涓鴻繖嬈$殑Session鍒嗛厤浜嗕竴涓鍙?0000錛岄偅涔圫erver S鏀跺埌鐨凜lient A鐨勫湴鍧鏄?02.187.45.3:60000錛岃繖灝辨槸Client A鐨勫緗戝湴鍧浜嗐傚悓鏍鳳紝Client B鐧誨綍Server S錛孨AT B緇欐嬈ession鍒嗛厤鐨勭鍙f槸40000錛岄偅涔圫erver S鏀跺埌鐨凚鐨勫湴鍧鏄?87.34.1.56:40000銆?br />聽聽聽 姝ゆ椂錛孋lient A涓嶤lient B閮藉彲浠ヤ笌Server S閫氫俊浜嗐傚鏋淐lient A姝ゆ椂鎯崇洿鎺ュ彂閫佷俊鎭粰Client B錛岄偅涔堜粬鍙互浠嶴erver S閭e効鑾峰緱B鐨勫叕緗戝湴鍧187.34.1.56:40000錛屾槸涓嶆槸Client A鍚戣繖涓湴鍧鍙戦佷俊鎭疌lient B灝辮兘鏀跺埌浜嗗憿錛熺瓟妗堟槸涓嶈錛屽洜涓哄鏋滆繖鏍峰彂閫佷俊鎭紝NAT B浼氬皢榪欎釜淇℃伅涓㈠純錛堝洜涓鴻繖鏍風殑淇℃伅鏄笉璇瘋嚜鏉ョ殑錛屼負浜嗗畨鍏紝澶у鏁癗AT閮戒細鎵ц涓㈠純鍔ㄤ綔錛夈傜幇鍦ㄦ垜浠渶瑕佺殑鏄湪NAT B涓婃墦涓涓柟鍚戜負202.187.45.3錛堝嵆Client A鐨勫緗戝湴鍧錛夌殑媧烇紝閭d箞Client A鍙戦佸埌187.34.1.56:40000鐨勪俊鎭?Client B灝辮兘鏀跺埌浜嗐傝繖涓墦媧炲懡浠ょ敱璋佹潵鍙戝憿錛屽懙鍛碉紝褰撶劧鏄疭erver S銆?br />聽聽聽 鎬葷粨涓涓嬭繖涓繃紼嬶細濡傛灉Client A鎯沖悜Client B鍙戦佷俊鎭紝閭d箞Client A鍙戦佸懡浠ょ粰Server S錛岃姹係erver S鍛戒護Client B鍚慍lient A鏂瑰悜鎵撴礊銆傚懙鍛碉紝鏄笉鏄緢緇曞彛錛屼笉榪囨病鍏崇郴錛屾兂涓鎯沖氨寰堟竻妤氫簡錛屼綍鍐佃繕鏈夋簮浠g爜鍛紙渚佸笀璇磋繃錛氬湪婧愪唬鐮侀潰鍓嶆病鏈夌瀵?8錛夛級錛岀劧鍚嶤lient A灝卞彲浠ラ氳繃Client B鐨勫緗戝湴鍧涓嶤lient B閫氫俊浜嗐?br />聽聽聽 <br />聽聽聽 娉ㄦ剰錛氫互涓婅繃紼嬪彧閫傚悎浜嶤one NAT鐨勬儏鍐碉紝濡傛灉鏄疭ymmetric NAT錛岄偅涔堝綋Client B鍚慍lient A鎵撴礊鐨勭鍙e凡緇忛噸鏂板垎閰嶄簡錛孋lient B灝嗘棤娉曠煡閬撹繖涓鍙o紙濡傛灉Symmetric NAT鐨勭鍙f槸欏哄簭鍒嗛厤鐨勶紝閭d箞鎴戜滑鎴栬鍙互鐚滄祴榪欎釜绔彛鍙鳳紝鍙槸鐢變簬鍙兘瀵艱嚧澶辮觸鐨勫洜绱犲お澶氾紝鎴戜滑涓嶆帹鑽愯繖縐嶇寽嫻嬬鍙g殑鏂規硶錛夈?br />聽聽聽 <br />聽聽聽 涓嬮潰鏄竴涓ā鎷烶2P鑱婂ぉ鐨勮繃紼嬬殑婧愪唬鐮侊紝榪囩▼寰堢畝鍗曪紝P2PServer榪愯鍦ㄤ竴涓嫢鏈夊叕緗慖P鐨勮綆楁満涓婏紝P2PClient榪愯鍦ㄤ袱涓笉鍚岀殑NAT鍚庯紙娉ㄦ剰錛屽鏋滀袱涓鎴風榪愯鍦ㄤ竴涓狽AT鍚庯紝鏈▼搴忓緢鍙兘涓嶈兘榪愯姝e父錛岃繖鍙栧喅浜庝綘鐨凬AT鏄惁鏀寔loopback translation錛岃瑙?a >http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt</a>錛屽綋鐒訛紝姝ら棶棰樺彲浠ラ氳繃鍙屾柟鍏堝皾璇曡繛鎺ュ鏂圭殑鍐呯綉IP鏉ヨВ鍐籌紝浣嗘槸榪欎釜浠g爜鍙槸涓轟簡楠岃瘉鍘熺悊錛屽茍娌℃湁澶勭悊榪欎簺闂錛夛紝鍚庣櫥褰曠殑璁$畻鏈哄彲浠ヨ幏寰楀厛鐧誨綍璁$畻鏈虹殑鐢ㄦ埛鍚嶏紝鍚庣櫥褰曠殑璁$畻鏈洪氳繃send username message鐨勬牸寮忔潵鍙戦佹秷鎭傚鏋滃彂閫佹垚鍔燂紝璇存槑浣犲凡鍙栧緱浜嗙洿鎺ヤ笌瀵規柟榪炴帴鐨勬垚鍔熴?br />聽聽聽 紼嬪簭鐜板湪鏀寔涓変釜鍛戒護錛歴end , getu , exit<br />聽聽聽 <br />聽聽聽 send鏍煎紡錛歴end username message<br />聽聽聽 鍔熻兘錛氬彂閫佷俊鎭粰username<br />聽聽聽 <br />聽聽聽 getu鏍煎紡錛歡etu<br />聽聽聽 鍔熻兘錛氳幏寰楀綋鍓嶆湇鍔″櫒鐢ㄦ埛鍒楄〃<br />聽聽聽 <br />聽聽聽 exit鏍煎紡錛歟xit<br />聽聽聽 鍔熻兘錛氭敞閿涓庢湇鍔″櫒鐨勮繛鎺ワ紙鏈嶅姟鍣ㄤ笉浼氳嚜鍔ㄧ洃嫻嬪鎴鋒槸鍚﹀悐綰匡級<br />聽聽聽聽聽聽聽 <br />聽聽聽 浠g爜寰堢煭錛岀浉淇″緢瀹規槗鎳傦紝濡傛灉鏈変粈涔堥棶棰橈紝鍙互緇欐垜鍙戦偖浠?a href="mailto:zhouhuis22@sina.com">zhouhuis22@sina.com</a>聽 鎴栬呭湪CSDN涓婂彂閫佺煭娑堟伅銆傚悓鏃訛紝嬈㈣繋杞彂姝ゆ枃錛屼絾甯屾湜淇濈暀浣滆呯増鏉?-錛夈?br />聽聽聽 <br />聽聽聽 鏈鍚庢劅璋SDN緗戝弸 PiggyXP 鍜?Seilfer鐨勬祴璇曞府鍔?/p> <p>P2PServer.c</p> <p>/* P2P 紼嬪簭鏈嶅姟绔?br />聽* <br />聽* 鏂囦歡鍚嶏細P2PServer.c<br />聽*<br />聽* 鏃ユ湡錛?004-5-21<br />聽*<br />聽* 浣滆咃細shootingstars(<a href="mailto:zhouhuis22@sina.com">zhouhuis22@sina.com</a>)<br />聽*<br />聽*/<br />#pragma comment(lib, "ws2_32.lib")</p> <p>#include "windows.h"<br />#include "..\proto.h"<br />#include "..\Exception.h"</p> <p>UserList ClientList;</p> <p>void InitWinSock()<br />{<br />聽WSADATA wsaData;</p> <p>聽if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)<br />聽{<br />聽聽printf("Windows sockets 2.2 startup");<br />聽聽throw Exception("");<br />聽}<br />聽else{<br />聽聽printf("Using %s (Status: %s)\n",<br />聽聽聽wsaData.szDescription, wsaData.szSystemStatus);<br />聽聽printf("with API versions %d.%d to %d.%d\n\n",<br />聽聽聽LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),<br />聽聽聽LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));<br />聽聽<br />聽}<br />}</p> <p>SOCKET mksock(int type)<br />{<br />聽SOCKET sock = socket(AF_INET, type, 0);<br />聽if (sock < 0)<br />聽{<br />聽聽聽聽聽聽聽 printf("create socket error");<br />聽聽throw Exception("");<br />聽}<br />聽return sock;<br />}</p> <p>stUserListNode GetUser(char *username)<br />{<br />聽for(UserList::iterator UserIterator=ClientList.begin();<br />聽聽聽聽聽聽UserIterator!=ClientList.end();<br />聽聽聽聽聽聽聽++UserIterator)<br />聽{<br />聽聽if( strcmp( ((*UserIterator)->userName), username) == 0 )<br />聽聽聽return *(*UserIterator);<br />聽}<br />聽throw Exception("not find this user");<br />}</p> <p>int main(int argc, char* argv[])<br />{<br />聽try{<br />聽聽InitWinSock();<br />聽聽<br />聽聽SOCKET PrimaryUDP;<br />聽聽PrimaryUDP = mksock(SOCK_DGRAM);</p> <p>聽聽sockaddr_in local;<br />聽聽local.sin_family=AF_INET;<br />聽聽local.sin_port= htons(SERVER_PORT); <br />聽聽local.sin_addr.s_addr = htonl(INADDR_ANY);<br />聽聽int nResult=bind(PrimaryUDP,(sockaddr*)&local,sizeof(sockaddr));<br />聽聽if(nResult==SOCKET_ERROR)<br />聽聽聽throw Exception("bind error");</p> <p>聽聽sockaddr_in sender;<br />聽聽stMessage recvbuf;<br />聽聽memset(&recvbuf,0,sizeof(stMessage));</p> <p>聽聽// 寮濮嬩富寰幆.<br />聽聽// 涓誨驚鐜礋璐d笅闈㈠嚑浠朵簨鎯?<br />聽聽// 涓:璇誨彇瀹㈡埛绔櫥闄嗗拰鐧誨嚭娑堟伅,璁板綍瀹㈡埛鍒楄〃<br />聽聽// 浜?杞彂瀹㈡埛p2p璇鋒眰<br />聽聽for(;;)<br />聽聽{<br />聽聽聽int dwSender = sizeof(sender);<br />聽聽聽int ret = recvfrom(PrimaryUDP, (char *)&recvbuf, sizeof(stMessage), 0, (sockaddr *)&sender, &dwSender);<br />聽聽聽if(ret <= 0)<br />聽聽聽{<br />聽聽聽聽printf("recv error");<br />聽聽聽聽continue;<br />聽聽聽}<br />聽聽聽else<br />聽聽聽{<br />聽聽聽聽int messageType = recvbuf.iMessageType;<br />聽聽聽聽switch(messageType){<br />聽聽聽聽case LOGIN:<br />聽聽聽聽聽{<br />聽聽聽聽聽聽//聽 灝嗚繖涓敤鎴風殑淇℃伅璁板綍鍒扮敤鎴峰垪琛ㄤ腑<br />聽聽聽聽聽聽printf("has a user login : %s\n", recvbuf.message.loginmember.userName);<br />聽聽聽聽聽聽stUserListNode *currentuser = new stUserListNode();<br />聽聽聽聽聽聽strcpy(currentuser->userName, recvbuf.message.loginmember.userName);<br />聽聽聽聽聽聽currentuser->ip = ntohl(sender.sin_addr.S_un.S_addr);<br />聽聽聽聽聽聽currentuser->port = ntohs(sender.sin_port);<br />聽聽聽聽聽聽<br />聽聽聽聽聽聽ClientList.push_back(currentuser);</p> <p>聽聽聽聽聽聽// 鍙戦佸凡緇忕櫥闄嗙殑瀹㈡埛淇℃伅<br />聽聽聽聽聽聽int nodecount = (int)ClientList.size();<br />聽聽聽聽聽聽sendto(PrimaryUDP, (const char*)&nodecount, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));<br />聽聽聽聽聽聽for(UserList::iterator UserIterator=ClientList.begin();<br />聽聽聽聽聽聽聽聽UserIterator!=ClientList.end();<br />聽聽聽聽聽聽聽聽++UserIterator)<br />聽聽聽聽聽聽{<br />聽聽聽聽聽聽聽sendto(PrimaryUDP, (const char*)(*UserIterator), sizeof(stUserListNode), 0, (const sockaddr*)&sender, sizeof(sender)); <br />聽聽聽聽聽聽}</p> <p>聽聽聽聽聽聽break;<br />聽聽聽聽聽}<br />聽聽聽聽case LOGOUT:<br />聽聽聽聽聽{<br />聽聽聽聽聽聽// 灝嗘瀹㈡埛淇℃伅鍒犻櫎<br />聽聽聽聽聽聽printf("has a user logout : %s\n", recvbuf.message.logoutmember.userName);<br />聽聽聽聽聽聽UserList::iterator removeiterator = NULL;<br />聽聽聽聽聽聽for(UserList::iterator UserIterator=ClientList.begin();<br />聽聽聽聽聽聽聽UserIterator!=ClientList.end();<br />聽聽聽聽聽聽聽++UserIterator)<br />聽聽聽聽聽聽{<br />聽聽聽聽聽聽聽if( strcmp( ((*UserIterator)->userName), recvbuf.message.logoutmember.userName) == 0 )<br />聽聽聽聽聽聽聽{<br />聽聽聽聽聽聽聽聽removeiterator = UserIterator;<br />聽聽聽聽聽聽聽聽break;<br />聽聽聽聽聽聽聽}<br />聽聽聽聽聽聽}<br />聽聽聽聽聽聽if(removeiterator != NULL)<br />聽聽聽聽聽聽聽ClientList.remove(*removeiterator);<br />聽聽聽聽聽聽break;<br />聽聽聽聽聽}<br />聽聽聽聽case P2PTRANS:<br />聽聽聽聽聽{<br />聽聽聽聽聽聽// 鏌愪釜瀹㈡埛甯屾湜鏈嶅姟绔悜鍙﹀涓涓鎴峰彂閫佷竴涓墦媧炴秷鎭?br />聽聽聽聽聽聽printf("%s wants to p2p %s\n",inet_ntoa(sender.sin_addr),recvbuf.message.translatemessage.userName);<br />聽聽聽聽聽聽stUserListNode node = GetUser(recvbuf.message.translatemessage.userName);<br />聽聽聽聽聽聽sockaddr_in remote;<br />聽聽聽聽聽聽remote.sin_family=AF_INET;<br />聽聽聽聽聽聽remote.sin_port= htons(node.port); <br />聽聽聽聽聽聽remote.sin_addr.s_addr = htonl(node.ip);</p> <p>聽聽聽聽聽聽in_addr tmp;<br />聽聽聽聽聽聽tmp.S_un.S_addr = htonl(node.ip);<br />聽聽聽聽聽聽printf("the address is %s,and port is %d\n",inet_ntoa(tmp), node.port);</p> <p>聽聽聽聽聽聽stP2PMessage transMessage;<br />聽聽聽聽聽聽transMessage.iMessageType = P2PSOMEONEWANTTOCALLYOU;<br />聽聽聽聽聽聽transMessage.iStringLen = ntohl(sender.sin_addr.S_un.S_addr);<br />聽聽聽聽聽聽transMessage.Port = ntohs(sender.sin_port);<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <br />聽聽聽聽聽聽sendto(PrimaryUDP,(const char*)&transMessage, sizeof(transMessage), 0, (const sockaddr *)&remote, sizeof(remote));</p> <p>聽聽聽聽聽聽break;<br />聽聽聽聽聽}<br />聽聽聽聽<br />聽聽聽聽case GETALLUSER:<br />聽聽聽聽聽{<br />聽聽聽聽聽聽int command = GETALLUSER;<br />聽聽聽聽聽聽sendto(PrimaryUDP, (const char*)&command, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));</p> <p>聽聽聽聽聽聽int nodecount = (int)ClientList.size();<br />聽聽聽聽聽聽sendto(PrimaryUDP, (const char*)&nodecount, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));</p> <p>聽聽聽聽聽聽for(UserList::iterator UserIterator=ClientList.begin();<br />聽聽聽聽聽聽聽聽UserIterator!=ClientList.end();<br />聽聽聽聽聽聽聽聽++UserIterator)<br />聽聽聽聽聽聽{<br />聽聽聽聽聽聽聽sendto(PrimaryUDP, (const char*)(*UserIterator), sizeof(stUserListNode), 0, (const sockaddr*)&sender, sizeof(sender)); <br />聽聽聽聽聽聽}<br />聽聽聽聽聽聽break;<br />聽聽聽聽聽}<br />聽聽聽聽}<br />聽聽聽}<br />聽聽}</p> <p>聽}<br />聽catch(Exception &e)<br />聽{<br />聽聽printf(e.GetMessage());<br />聽聽return 1;<br />聽}</p> <p>聽return 0;<br />}<br /></p> <p>/* P2P 紼嬪簭瀹㈡埛绔?br />聽* <br />聽* 鏂囦歡鍚嶏細P2PClient.c<br />聽*<br />聽* 鏃ユ湡錛?004-5-21<br />聽*<br />聽* 浣滆咃細shootingstars(<a href="mailto:zhouhuis22@sina.com">zhouhuis22@sina.com</a>)<br />聽*<br />聽*/</p> <p>#pragma comment(lib,"ws2_32.lib")</p> <p>#include "windows.h"<br />#include "..\proto.h"<br />#include "..\Exception.h"<br />#include <iostream><br />using namespace std;</p> <p>UserList ClientList;</p> <p>聽</p> <p>#define COMMANDMAXC 256<br />#define MAXRETRY聽聽聽 5</p> <p>SOCKET PrimaryUDP;<br />char UserName[10];<br />char ServerIP[20];</p> <p>bool RecvedACK;</p> <p>void InitWinSock()<br />{<br />聽WSADATA wsaData;</p> <p>聽if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)<br />聽{<br />聽聽printf("Windows sockets 2.2 startup");<br />聽聽throw Exception("");<br />聽}<br />聽else{<br />聽聽printf("Using %s (Status: %s)\n",<br />聽聽聽wsaData.szDescription, wsaData.szSystemStatus);<br />聽聽printf("with API versions %d.%d to %d.%d\n\n",<br />聽聽聽LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),<br />聽聽聽LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));<br />聽}<br />}</p> <p>SOCKET mksock(int type)<br />{<br />聽SOCKET sock = socket(AF_INET, type, 0);<br />聽if (sock < 0)<br />聽{<br />聽聽聽聽聽聽聽 printf("create socket error");<br />聽聽throw Exception("");<br />聽}<br />聽return sock;<br />}</p> <p>stUserListNode GetUser(char *username)<br />{<br />聽for(UserList::iterator UserIterator=ClientList.begin();<br />聽聽聽聽聽聽UserIterator!=ClientList.end();<br />聽聽聽聽聽聽聽++UserIterator)<br />聽{<br />聽聽if( strcmp( ((*UserIterator)->userName), username) == 0 )<br />聽聽聽return *(*UserIterator);<br />聽}<br />聽throw Exception("not find this user");<br />}</p> <p>void BindSock(SOCKET sock)<br />{<br />聽sockaddr_in sin;<br />聽sin.sin_addr.S_un.S_addr = INADDR_ANY;<br />聽sin.sin_family = AF_INET;<br />聽sin.sin_port = 0;<br />聽<br />聽if (bind(sock, (struct sockaddr*)&sin, sizeof(sin)) < 0)<br />聽聽throw Exception("bind error");<br />}</p> <p>void ConnectToServer(SOCKET sock,char *username, char *serverip)<br />{<br />聽sockaddr_in remote;<br />聽remote.sin_addr.S_un.S_addr = inet_addr(serverip);<br />聽remote.sin_family = AF_INET;<br />聽remote.sin_port = htons(SERVER_PORT);<br />聽<br />聽stMessage sendbuf;<br />聽sendbuf.iMessageType = LOGIN;<br />聽strncpy(sendbuf.message.loginmember.userName, username, 10);</p> <p>聽sendto(sock, (const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr*)&remote,sizeof(remote));</p> <p>聽int usercount;<br />聽int fromlen = sizeof(remote);<br />聽int iread = recvfrom(sock, (char *)&usercount, sizeof(int), 0, (sockaddr *)&remote, &fromlen);<br />聽if(iread<=0)<br />聽{<br />聽聽throw Exception("Login error\n");<br />聽}</p> <p>聽// 鐧誨綍鍒版湇鍔$鍚庯紝鎺ユ敹鏈嶅姟绔彂鏉ョ殑宸茬粡鐧誨綍鐨勭敤鎴風殑淇℃伅<br />聽cout<<"Have "<<usercount<<" users logined server:"<<endl;<br />聽for(int i = 0;i<usercount;i++)<br />聽{<br />聽聽stUserListNode *node = new stUserListNode;<br />聽聽recvfrom(sock, (char*)node, sizeof(stUserListNode), 0, (sockaddr *)&remote, &fromlen);<br />聽聽ClientList.push_back(node);<br />聽聽cout<<"Username:"<<node->userName<<endl;<br />聽聽in_addr tmp;<br />聽聽tmp.S_un.S_addr = htonl(node->ip);<br />聽聽cout<<"UserIP:"<<inet_ntoa(tmp)<<endl;<br />聽聽cout<<"UserPort:"<<node->port<<endl;<br />聽聽cout<<""<<endl;<br />聽}<br />}</p> <p>void OutputUsage()<br />{<br />聽cout<<"You can input you command:\n"<br />聽聽<<"Command Type:\"send\",\"exit\",\"getu\"\n"<br />聽聽<<"Example : send Username Message\n"<br />聽聽<<"聽聽聽聽聽聽聽聽聽 exit\n"<br />聽聽<<"聽聽聽聽聽聽聽聽聽 getu\n"<br />聽聽<<endl;<br />}</p> <p>/* 榪欐槸涓昏鐨勫嚱鏁幫細鍙戦佷竴涓秷鎭粰鏌愪釜鐢ㄦ埛(C)<br />聽*嫻佺▼錛氱洿鎺ュ悜鏌愪釜鐢ㄦ埛鐨勫緗慖P鍙戦佹秷鎭紝濡傛灉姝ゅ墠娌℃湁鑱旂郴榪?br />聽*聽聽聽聽聽 閭d箞姝ゆ秷鎭皢鏃犳硶鍙戦侊紝鍙戦佺絳夊緟瓚呮椂銆?br />聽*聽聽聽聽聽 瓚呮椂鍚庯紝鍙戦佺灝嗗彂閫佷竴涓姹備俊鎭埌鏈嶅姟绔紝<br />聽*聽聽聽聽聽 瑕佹眰鏈嶅姟绔彂閫佺粰瀹㈡埛C涓涓姹傦紝璇鋒眰C緇欐湰鏈哄彂閫佹墦媧炴秷鎭?br />聽*聽聽聽聽聽 浠ヤ笂嫻佺▼灝嗛噸澶峂AXRETRY嬈?br />聽*/<br />bool SendMessageTo(char *UserName, char *Message)<br />{<br />聽char realmessage[256];<br />聽unsigned int UserIP;<br />聽unsigned short UserPort;<br />聽bool FindUser = false;<br />聽for(UserList::iterator UserIterator=ClientList.begin();<br />聽聽聽聽聽聽UserIterator!=ClientList.end();<br />聽聽聽聽聽聽++UserIterator)<br />聽{<br />聽聽if( strcmp( ((*UserIterator)->userName), UserName) == 0 )<br />聽聽{<br />聽聽聽UserIP = (*UserIterator)->ip;<br />聽聽聽UserPort = (*UserIterator)->port;<br />聽聽聽FindUser = true;<br />聽聽}<br />聽}</p> <p>聽if(!FindUser)<br />聽聽return false;</p> <p>聽strcpy(realmessage, Message);<br />聽for(int i=0;i<MAXRETRY;i++)<br />聽{<br />聽聽RecvedACK = false;</p> <p>聽聽sockaddr_in remote;<br />聽聽remote.sin_addr.S_un.S_addr = htonl(UserIP);<br />聽聽remote.sin_family = AF_INET;<br />聽聽remote.sin_port = htons(UserPort);<br />聽聽stP2PMessage MessageHead;<br />聽聽MessageHead.iMessageType = P2PMESSAGE;<br />聽聽MessageHead.iStringLen = (int)strlen(realmessage)+1;<br />聽聽int isend = sendto(PrimaryUDP, (const char *)&MessageHead, sizeof(MessageHead), 0, (const sockaddr*)&remote, sizeof(remote));<br />聽聽isend = sendto(PrimaryUDP, (const char *)&realmessage, MessageHead.iStringLen, 0, (const sockaddr*)&remote, sizeof(remote));<br />聽聽<br />聽聽// 絳夊緟鎺ユ敹綰跨▼灝嗘鏍囪淇敼<br />聽聽for(int j=0;j<10;j++)<br />聽聽{<br />聽聽聽if(RecvedACK)<br />聽聽聽聽return true;<br />聽聽聽else<br />聽聽聽聽Sleep(300);<br />聽聽}</p> <p>聽聽// 娌℃湁鎺ユ敹鍒扮洰鏍囦富鏈虹殑鍥炲簲錛岃涓虹洰鏍囦富鏈虹殑绔彛鏄犲皠娌℃湁<br />聽聽// 鎵撳紑錛岄偅涔堝彂閫佽姹備俊鎭粰鏈嶅姟鍣紝瑕佹湇鍔″櫒鍛婅瘔鐩爣涓繪満<br />聽聽// 鎵撳紑鏄犲皠绔彛錛圲DP鎵撴礊錛?br />聽聽sockaddr_in server;<br />聽聽server.sin_addr.S_un.S_addr = inet_addr(ServerIP);<br />聽聽server.sin_family = AF_INET;<br />聽聽server.sin_port = htons(SERVER_PORT);<br />聽<br />聽聽stMessage transMessage;<br />聽聽transMessage.iMessageType = P2PTRANS;<br />聽聽strcpy(transMessage.message.translatemessage.userName, UserName);</p> <p>聽聽sendto(PrimaryUDP, (const char*)&transMessage, sizeof(transMessage), 0, (const sockaddr*)&server, sizeof(server));<br />聽聽Sleep(100);// 絳夊緟瀵規柟鍏堝彂閫佷俊鎭?br />聽}<br />聽return false;<br />}<br /></p> <p>// 瑙f瀽鍛戒護錛屾殏鏃跺彧鏈塭xit鍜宻end鍛戒護<br />// 鏂板getu鍛戒護錛岃幏鍙栧綋鍓嶆湇鍔″櫒鐨勬墍鏈夌敤鎴?br />void ParseCommand(char * CommandLine)<br />{<br />聽if(strlen(CommandLine)<4)<br />聽聽return;<br />聽char Command[10];<br />聽strncpy(Command, CommandLine, 4);<br />聽Command[4]='\0';</p> <p>聽if(strcmp(Command,"exit")==0)<br />聽{<br />聽聽stMessage sendbuf;<br />聽聽sendbuf.iMessageType = LOGOUT;<br />聽聽strncpy(sendbuf.message.logoutmember.userName, UserName, 10);<br />聽聽sockaddr_in server;<br />聽聽server.sin_addr.S_un.S_addr = inet_addr(ServerIP);<br />聽聽server.sin_family = AF_INET;<br />聽聽server.sin_port = htons(SERVER_PORT);</p> <p>聽聽sendto(PrimaryUDP,(const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr *)&server, sizeof(server));<br />聽聽shutdown(PrimaryUDP, 2);<br />聽聽closesocket(PrimaryUDP);<br />聽聽exit(0);<br />聽}<br />聽else if(strcmp(Command,"send")==0)<br />聽{<br />聽聽char sendname[20];<br />聽聽char message[COMMANDMAXC];<br />聽聽int i;<br />聽聽for(i=5;;i++)<br />聽聽{<br />聽聽聽if(CommandLine[i]!=' ')<br />聽聽聽聽sendname[i-5]=CommandLine[i];<br />聽聽聽else<br />聽聽聽{<br />聽聽聽聽sendname[i-5]='\0';<br />聽聽聽聽break;<br />聽聽聽}<br />聽聽}<br />聽聽strcpy(message, &(CommandLine[i+1]));<br />聽聽if(SendMessageTo(sendname, message))<br />聽聽聽printf("Send OK!\n");<br />聽聽else <br />聽聽聽printf("Send Failure!\n");<br />聽}<br />聽else if(strcmp(Command,"getu")==0)<br />聽{<br />聽聽int command = GETALLUSER;<br />聽聽sockaddr_in server;<br />聽聽server.sin_addr.S_un.S_addr = inet_addr(ServerIP);<br />聽聽server.sin_family = AF_INET;<br />聽聽server.sin_port = htons(SERVER_PORT);</p> <p>聽聽sendto(PrimaryUDP,(const char*)&command, sizeof(command), 0, (const sockaddr *)&server, sizeof(server));<br />聽}<br />}</p> <p>// 鎺ュ彈娑堟伅綰跨▼<br />DWORD WINAPI RecvThreadProc(LPVOID lpParameter)<br />{<br />聽sockaddr_in remote;<br />聽int sinlen = sizeof(remote);<br />聽stP2PMessage recvbuf;<br />聽for(;;)<br />聽{<br />聽聽int iread = recvfrom(PrimaryUDP, (char *)&recvbuf, sizeof(recvbuf), 0, (sockaddr *)&remote, &sinlen);<br />聽聽if(iread<=0)<br />聽聽{<br />聽聽聽printf("recv error\n");<br />聽聽聽continue;<br />聽聽}<br />聽聽switch(recvbuf.iMessageType)<br />聽聽{<br />聽聽case P2PMESSAGE:<br />聽聽聽{<br />聽聽聽聽// 鎺ユ敹鍒癙2P鐨勬秷鎭?br />聽聽聽聽char *comemessage= new char[recvbuf.iStringLen];<br />聽聽聽聽int iread1 = recvfrom(PrimaryUDP, comemessage, 256, 0, (sockaddr *)&remote, &sinlen);<br />聽聽聽聽comemessage[iread1-1] = '\0';<br />聽聽聽聽if(iread1<=0)<br />聽聽聽聽聽throw Exception("Recv Message Error\n");<br />聽聽聽聽else<br />聽聽聽聽{<br />聽聽聽聽聽printf("Recv a Message:%s\n",comemessage);<br />聽聽聽聽聽<br />聽聽聽聽聽stP2PMessage sendbuf;<br />聽聽聽聽聽sendbuf.iMessageType = P2PMESSAGEACK;<br />聽聽聽聽聽sendto(PrimaryUDP, (const char*)&sendbuf, sizeof(sendbuf), 0, (const sockaddr*)&remote, sizeof(remote));<br />聽聽聽聽}</p> <p>聽聽聽聽delete []comemessage;<br />聽聽聽聽break;</p> <p>聽聽聽}<br />聽聽case P2PSOMEONEWANTTOCALLYOU:<br />聽聽聽{<br />聽聽聽聽// 鎺ユ敹鍒版墦媧炲懡浠わ紝鍚戞寚瀹氱殑IP鍦板潃鎵撴礊<br />聽聽聽聽printf("Recv p2someonewanttocallyou data\n");<br />聽聽聽聽sockaddr_in remote;<br />聽聽聽聽remote.sin_addr.S_un.S_addr = htonl(recvbuf.iStringLen);<br />聽聽聽聽remote.sin_family = AF_INET;<br />聽聽聽聽remote.sin_port = htons(recvbuf.Port);</p> <p>聽聽聽聽// UDP hole punching<br />聽聽聽聽stP2PMessage message;<br />聽聽聽聽message.iMessageType = P2PTRASH;<br />聽聽聽聽sendto(PrimaryUDP, (const char *)&message, sizeof(message), 0, (const sockaddr*)&remote, sizeof(remote));<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <br />聽聽聽聽break;<br />聽聽聽}<br />聽聽case P2PMESSAGEACK:<br />聽聽聽{<br />聽聽聽聽// 鍙戦佹秷鎭殑搴旂瓟<br />聽聽聽聽RecvedACK = true;<br />聽聽聽聽break;<br />聽聽聽}<br />聽聽case P2PTRASH:<br />聽聽聽{<br />聽聽聽聽// 瀵規柟鍙戦佺殑鎵撴礊娑堟伅錛屽拷鐣ユ帀銆?br />聽聽聽聽//do nothing ...<br />聽聽聽聽printf("Recv p2ptrash data\n");<br />聽聽聽聽break;<br />聽聽聽}<br />聽聽case GETALLUSER:<br />聽聽聽{<br />聽聽聽聽int usercount;<br />聽聽聽聽int fromlen = sizeof(remote);<br />聽聽聽聽int iread = recvfrom(PrimaryUDP, (char *)&usercount, sizeof(int), 0, (sockaddr *)&remote, &fromlen);<br />聽聽聽聽if(iread<=0)<br />聽聽聽聽{<br />聽聽聽聽聽throw Exception("Login error\n");<br />聽聽聽聽}<br />聽聽聽聽<br />聽聽聽聽ClientList.clear();</p> <p>聽聽聽聽cout<<"Have "<<usercount<<" users logined server:"<<endl;<br />聽聽聽聽for(int i = 0;i<usercount;i++)<br />聽聽聽聽{<br />聽聽聽聽聽stUserListNode *node = new stUserListNode;<br />聽聽聽聽聽recvfrom(PrimaryUDP, (char*)node, sizeof(stUserListNode), 0, (sockaddr *)&remote, &fromlen);<br />聽聽聽聽聽ClientList.push_back(node);<br />聽聽聽聽聽cout<<"Username:"<<node->userName<<endl;<br />聽聽聽聽聽in_addr tmp;<br />聽聽聽聽聽tmp.S_un.S_addr = htonl(node->ip);<br />聽聽聽聽聽cout<<"UserIP:"<<inet_ntoa(tmp)<<endl;<br />聽聽聽聽聽cout<<"UserPort:"<<node->port<<endl;<br />聽聽聽聽聽cout<<""<<endl;<br />聽聽聽聽}<br />聽聽聽聽break;<br />聽聽聽}<br />聽聽}<br />聽}<br />}</p> <p> <br />int main(int argc, char* argv[])<br />{<br />聽try<br />聽{<br />聽聽InitWinSock();<br />聽聽<br />聽聽PrimaryUDP = mksock(SOCK_DGRAM);<br />聽聽BindSock(PrimaryUDP);</p> <p>聽聽cout<<"Please input server ip:";<br />聽聽cin>>ServerIP;</p> <p>聽聽cout<<"Please input your name:";<br />聽聽cin>>UserName;</p> <p>聽聽ConnectToServer(PrimaryUDP, UserName, ServerIP);</p> <p>聽聽HANDLE threadhandle = CreateThread(NULL, 0, RecvThreadProc, NULL, NULL, NULL);<br />聽聽CloseHandle(threadhandle);<br />聽聽OutputUsage();</p> <p>聽聽for(;;)<br />聽聽{<br />聽聽聽char Command[COMMANDMAXC];<br />聽聽聽gets(Command);<br />聽聽聽ParseCommand(Command);<br />聽聽}<br />聽}<br />聽catch(Exception &e)<br />聽{<br />聽聽printf(e.GetMessage());<br />聽聽return 1;<br />聽}<br />聽return 0;<br />}<br /></p> <p>/* 寮傚父綾?br />聽*<br />聽* 鏂囦歡鍚嶏細Exception.h<br />聽*<br />聽* 鏃ユ湡錛?004.5.5<br />聽*<br />聽* 浣滆咃細shootingstars(<a href="mailto:zhouhuis22@sina.com">zhouhuis22@sina.com</a>)<br />聽*/</p> <p>#ifndef __HZH_Exception__<br />#define __HZH_Exception__</p> <p>#define EXCEPTION_MESSAGE_MAXLEN 256<br />#include "string.h"</p> <p>class Exception<br />{<br />private:<br />聽char m_ExceptionMessage[EXCEPTION_MESSAGE_MAXLEN];<br />public:<br />聽Exception(char *msg)<br />聽{<br />聽聽strncpy(m_ExceptionMessage, msg, EXCEPTION_MESSAGE_MAXLEN);<br />聽}</p> <p>聽char *GetMessage()<br />聽{<br />聽聽return m_ExceptionMessage;<br />聽}<br />};</p> <p>#endif<br /></p> <p>/* P2P 紼嬪簭浼犺緭鍗忚<br />聽* <br />聽* 鏃ユ湡錛?004-5-21<br />聽*<br />聽* 浣滆咃細shootingstars(<a href="mailto:zhouhuis22@sina.com">zhouhuis22@sina.com</a>)<br />聽*<br />聽*/</p> <p>#pragma once<br />#include <list></p> <p>// 瀹氫箟iMessageType鐨勫?br />#define LOGIN 1<br />#define LOGOUT 2<br />#define P2PTRANS 3<br />#define GETALLUSER聽 4</p> <p>// 鏈嶅姟鍣ㄧ鍙?br />#define SERVER_PORT 2280</p> <p>// Client鐧誨綍鏃跺悜鏈嶅姟鍣ㄥ彂閫佺殑娑堟伅<br />struct stLoginMessage<br />{<br />聽char userName[10];<br />聽char password[10];<br />};</p> <p>// Client娉ㄩ攢鏃跺彂閫佺殑娑堟伅<br />struct stLogoutMessage<br />{<br />聽char userName[10];<br />};</p> <p>// Client鍚戞湇鍔″櫒璇鋒眰鍙﹀涓涓狢lient(userName)鍚戣嚜宸辨柟鍚戝彂閫乁DP鎵撴礊娑堟伅<br />struct stP2PTranslate<br />{<br />聽char userName[10];<br />};</p> <p>// Client鍚戞湇鍔″櫒鍙戦佺殑娑堟伅鏍煎紡<br />struct stMessage<br />{<br />聽int iMessageType;<br />聽union _message<br />聽{<br />聽聽stLoginMessage loginmember;<br />聽聽stLogoutMessage logoutmember;<br />聽聽stP2PTranslate translatemessage;<br />聽}message;<br />};</p> <p>// 瀹㈡埛鑺傜偣淇℃伅<br />struct stUserListNode<br />{<br />聽char userName[10];<br />聽unsigned int ip;<br />聽unsigned short port;<br />};</p> <p>// Server鍚慍lient鍙戦佺殑娑堟伅<br />struct stServerToClient<br />{<br />聽int iMessageType;<br />聽union _message<br />聽{<br />聽聽stUserListNode user;<br />聽}message;</p> <p>};</p> <p>//======================================<br />// 涓嬮潰鐨勫崗璁敤浜庡鎴風涔嬮棿鐨勯氫俊<br />//======================================<br />#define P2PMESSAGE 100聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 鍙戦佹秷鎭?br />#define P2PMESSAGEACK 101聽聽聽聽聽聽聽聽聽聽聽 // 鏀跺埌娑堟伅鐨勫簲絳?br />#define P2PSOMEONEWANTTOCALLYOU 102聽 // 鏈嶅姟鍣ㄥ悜瀹㈡埛绔彂閫佺殑娑堟伅<br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // 甯屾湜姝ゅ鎴風鍙戦佷竴涓猆DP鎵撴礊鍖?br />#define P2PTRASH聽聽聽聽聽聽聽 103聽聽聽聽聽聽聽聽聽 // 瀹㈡埛绔彂閫佺殑鎵撴礊鍖咃紝鎺ユ敹绔簲璇ュ拷鐣ユ娑堟伅</p> <p>// 瀹㈡埛绔箣闂村彂閫佹秷鎭牸寮?br />struct stP2PMessage<br />{<br />聽int iMessageType;<br />聽int iStringLen;聽聽聽聽聽聽聽聽 // or IP address<br />聽unsigned short Port; <br />};</p> <p>using namespace std;<br />typedef list<stUserListNode *> UserList;</p> </div> <img src ="http://www.shnenglu.com/shenhuafeng/aggbug/17215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shenhuafeng/" target="_blank">CPP&&璁捐妯″紡灝忓眿</a> 2007-01-04 13:37 <a href="http://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17215.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>Peer-to-Peer (P2P) communication across middleboxes(杞?http://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17214.htmlCPP&&璁捐妯″紡灝忓眿CPP&&璁捐妯″紡灝忓眿Thu, 04 Jan 2007 05:35:00 GMThttp://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17214.htmlhttp://www.shnenglu.com/shenhuafeng/comments/17214.htmlhttp://www.shnenglu.com/shenhuafeng/archive/2007/01/04/17214.html#Feedback0http://www.shnenglu.com/shenhuafeng/comments/commentRss/17214.htmlhttp://www.shnenglu.com/shenhuafeng/services/trackbacks/17214.html闃呰鍏ㄦ枃

CPP&&璁捐妯″紡灝忓眿 2007-01-04 13:35 鍙戣〃璇勮
]]>
久久久久久噜噜精品免费直播| 欧美国产精品久久高清| 五月丁香综合激情六月久久| 2021国内久久精品| 狠狠狠色丁香婷婷综合久久俺| 国产午夜精品久久久久九九| 久久久久香蕉视频| 国内精品久久人妻互换| 精品无码人妻久久久久久| 精品熟女少妇AV免费久久| 久久青青草原综合伊人| 亚洲精品无码久久千人斩| 国产精品综合久久第一页| 亚洲精品乱码久久久久久中文字幕| 久久国产一区二区| 久久久亚洲欧洲日产国码二区 | 久久精品成人免费网站| 久久亚洲国产精品成人AV秋霞| 久久国产精品-久久精品| 久久综合色老色| 久久精品国产99久久香蕉| 99国产精品久久| 久久综合亚洲欧美成人| 一本久久a久久精品综合香蕉 | 欧美性猛交xxxx免费看久久久| 久久国产精品成人片免费| 久久亚洲AV无码精品色午夜麻豆 | 国产精品成人99久久久久| 久久久久久久久久久久中文字幕| 女人高潮久久久叫人喷水| 青青热久久国产久精品| 久久精品国产欧美日韩| 久久综合九色综合久99 | 青青草国产97免久久费观看| 久久久久亚洲av成人无码电影 | 久久r热这里有精品视频| 久久精品国产亚洲av水果派| 久久亚洲AV成人出白浆无码国产| 亚洲午夜久久久影院伊人| 亚洲精品tv久久久久久久久| 狠狠色噜噜色狠狠狠综合久久|