與基於udp協議的tracker伺服器進行互動

2021-03-31 08:57:00 字數 4585 閱讀 2645

通常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...