通常bt客戶端每幾分鐘就要向tracker傳送一次請求.對於一些比較大的bt站點,其tracker的壓力是可想而知的.降低tracker的壓力首先考慮到的當然是採用更低網路開銷的udp協議.於是bittorrent udp-tracker protocol應運而生.
這個協議很簡單.
下面是實現它的封裝類:
// udptrackerclient.h: inte***ce for the cudptrackerclient class.////
#if !defined(afx_udptrackerclient_h__69b6acc8_8193_4680_81d8_925b1550e92c__included_)
#define afx_udptrackerclient_h__69b6acc8_8193_4680_81d8_925b1550e92c__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
#include #pragma ***ment(lib, "ws2_32.lib")
#ifndef _disablewarning4786_4355
#define _disablewarning4786_4355
#pragma warning( disable : 4786 )
#pragma warning( disable : 4355 )
#endif
#ifndef _enableusestl
#define _enableusestl
#include #include #include #include #include #include using namespace std;
#endif
class cpeerhostinfo
; class cudptrackerclient
;#endif // !defined(afx_udptrackerclient_h__69b6acc8_8193_4680_81d8_925b1550e92c__included_)// udptrackerclient.cpp: implementation of the cudptrackerclient class.
////
#include "stdafx.h"
#include "udptrackerclient.h"
#include "datastream.h"
#ifdef _debug
#undef this_file
static char this_file=__file__;
#define new debug_new
#endif
//// construction/destruction
//#define recvbufsize 2048
cudptrackerclient::cudptrackerclient()
cudptrackerclient::~cudptrackerclient()
void cudptrackerclient::cancelsocketoperate()
}bool cudptrackerclient::disconnect()
return false;
}//szserver連線的主機,可以是下列形式的字串:
//easeso.***:1000
//easeso.***
//如果wport不為0,則szserver不應該包含埠資訊
bool cudptrackerclient::connect(const char * szserver,word wport)
if(m_dwip == 0)
else
strhost = strserver;
} else
if(m_wport == 0)
m_wport = 80;
//check if address is an ip or a domain name
int a = strhost[0];
if (a > 47 && a < 58)
m_dwip = i***_addr(strhost);
else
}
if((gettickcount()-m_dwconnecttick)>30000)
if(m_socket != invalid_socket && m_dwip && m_wport && m_iconnection_id ==0)
if(ires>=16)
else if(dwaction == 3)//得到乙個錯誤資訊包
}
} }
if(m_iconnection_id)
bres = true;
return bres;
}//提交請求
//pinfohash 20位元組的資料緩衝區指標
//ppeerid 20位元組的資料緩衝區指標
//ievent引數值:
//none = 0
//***pleted = 1
//started = 2
//stopped = 3
dword cudptrackerclient::announcing(byte* pinfohash,byte * ppeerid,
__int64 idownloaded,__int64 ileft,__int64 iuploaded,
int ievent,
dword dwip,word wport)
if(ires>=20)
if(m_dwnumpeers>m_listpeers.size())
if(ires>=6)
}
}
m_dwnumpeers = m_listpeers.size();
dwreturncode = 200;
}
else if(dwaction == 3)//得到乙個錯誤資訊包
}
} }
//每次都要求重新連線
m_iconnection_id = 0;
return dwreturncode;
}// datastream.h: inte***ce for the cdatastream class.
////
#if !defined(afx_datastream_h__d90a2534_ea73_4bea_8b7e_87e59a3d1d26__included_)
#define afx_datastream_h__d90a2534_ea73_4bea_8b7e_87e59a3d1d26__included_
#if _msc_ver > 1000
#pragma once
#endif // _msc_ver > 1000
#include //資料流操作函式
class cdatastream
~cdatastream()
void clear()
//此函式不動態增加記憶體,一次列印的資料長度不應該超過緩衝區的三分之一,否則可能導致失敗
bool printf(const char * format,...)
return false;
} //此函式拷貝字串
bool strcpy(const char * szstr)
return false;
} char * getcurrentpos()
void move(int ilen)//當前指標向後移動ilen
void reset()
byte readbyte()
void writebyte(byte btvalue)
word readword()
void writeword(word wvalue)
dword readdword()
void writedword(dword dwvalue)
__int64 readint64()
void writeint64(__int64 ivalue)
byte * readdata(dword dwlen)
void writedata(byte * pdata,dword dwlen)
char * readstring()
int size()
const char * getbuffer()
private :
char* buffer;
char* current;
int m_isize;
};class **etworkbyteorder
static int convert(int ivalue)
static __int64 convert(__int64 ivalue) };
#endif // !defined(afx_datastream_h__d90a2534_ea73_4bea_8b7e_87e59a3d1d26__included_)
在逸搜(easeso)
.到此,第一階段工作完成,下面要做的就是peer之間的互動了.
基於UDP協議的socket程式設計
一 socket概述 1.socket一般被稱為 套接字 網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端就叫做socket。2.建立網路通訊連線至少需要乙個埠號 socket socket利用網路之間的通訊設施實現程序通訊,但它對通訊設施的細節不關心,只要通訊設施能夠提供足夠的...
基於UDP協議的socket程式設計
udp協議特點 1.無連線。服務端與客戶端傳輸資料之前不需要進行連線,且沒有超時重發等機制,只是把資料通過網路傳送出去。也正是因為此特點,所以基於udp協議的socket的客戶端在啟動之前不需要先啟動服務端。2.不可靠。資料在本地通過網路發出之後,udp協議會立即清除本地的快取,即使對方沒有收到該資...
udp協議 基於socketserver實現併發
一 udp協議沒有粘包問題 1,udp協議是資料報協議 客戶端 import socket client socket.socket socket.af inet,socket.sock dgram 資料報協議 udp client.sendto hello encode utf 8 127.0.0...