為連上peer ,我試過了關閉本機所有防火墻。 試了幾十個從 tracker 服務器回傳的不同的 peer , 多數這些peer 都 ping得通,但卻次次都連不上,要么回傳錯誤:遠程計算機積極拒絕,要么遠程計算機長時間無回復。
下面是我的簡化后的代碼:
public value struct peerInfo
{
Int32 piAddress;
Int16 psPort;
};
System::Void fmNewDLTask::connect_PeersList_Test()
{
IPEndPoint^ iPeerEndPoint;
array<Byte>^ peer_handshake_bytes = gcnew array<Byte>(0x44){ 0 }; // peer 握手訊息是一個長度固定為 68 位元組的訊息
array<byte>^ arrbsBitProtocol = Encoding::UTF8->GetBytes("BitTorrent protocol");
array<Byte>^ info_SHA1 = {0x6b ,0x51 , 0x11,0x39 ,0x7b ,0x26 ,0xec ,0x26 ,
0xa ,0x35 ,0xa1 ,0x58,0xd3,0xa2,0xf9,0x95,0x64,0xae,0x78,0xb5 };
array<Byte>^ peer_id_SHA1 = { 0x2d,0x41,0x5a,0x32,0x30,0x36,0x30,0x2d,0xe6,0x64,0x36,0xc4,
0x9c,0x2c,0xd9,0x35,0xfc,0xd2,0xea,0x34};
array<peerInfo>^ pInfo = { { 0x718c4c6a, 0x4bb7 }, { 0x3dad4080, 0x3a98 },
{ 0x6f2b7aad, 0x3a98 }, { 0x7804a824, 0x3a98 },
{ 0xab520253, 0x0 }, { 0xafa27d72, 0x3a98 }, { 0xdb93ad47, 0x3a98 } };
peer_handshake_bytes[0] = 0x13; // =十進制 19
peer_handshake_bytes->Copy(arrbsBitProtocol, 0, peer_handshake_bytes, 1, arrbsBitProtocol->Length);
// 8 byte 保留位元組默認值為0(draft中對保留位元組有定義)
peer_handshake_bytes->Copy(info_SHA1, 0, peer_handshake_bytes, 0x1c, info_SHA1->Length);
peer_handshake_bytes->Copy(peer_id_SHA1, 0, peer_handshake_bytes, 0x30, peer_id_SHA1->Length);
System::Net::Sockets::Socket^ peer_Socket = nullptr;
for (int i = 0; i < pInfo->Length; i++)
{
//Debug::WriteLine("0x" + pInfo[i].piAddress.ToString("X") + " (" + (IPEndPoint(pInfo[i].piAddress, pInfo[i].psPort).ToString()) + ")\t0x" + pInfo[i].psPort.ToString("X") + " (" + pInfo[i].psPort.ToString() + ")");
Debug::WriteLine("0x" + pInfo[i].piAddress.ToString("X") +"\t0x" + pInfo[i].psPort.ToString("X") + " (" + pInfo[i].psPort.ToString() + ")");
iPeerEndPoint = gcnew IPEndPoint(htonl(pInfo[i].piAddress), htons(pInfo[i].psPort));
//iPeerEndPoint = gcnew IPEndPoint(htonl(pInfo[i].piAddress), 80);
peer_Socket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp);
bool blockingState = peer_Socket->Blocking;
try
{
peer_Socket->Connect(iPeerEndPoint); //總是這一行出錯 :要么遠程計算機積極拒絕,要么遠程計算機長時間無回復。
if (!peer_Socket->Connected)
{
Debug::WriteLine(DateTime::Now.ToString() + " 連接 Peer " + iPeerEndPoint->Address->ToString() +
":" + iPeerEndPoint->Port + " Connect failed !");
}
peer_Socket->Blocking = false;
if ((peer_Socket->Send(peer_handshake_bytes, 0, peer_handshake_bytes->Length, SocketFlags::None)) < peer_handshake_bytes->Length)
{
//SendFailed_MemClear(Mag_Handshake, Mag_Handshake); // clear Memory
return;
}
}
catch (SocketException^ se)
{
Debug::Write("SocketException caught!!!" );
Debug::WriteLine( "Source : " + se->Source + "Message: " + se->Message);
}
finally
{
peer_Socket->Close();
peer_Socket = nullptr;
}
}
}
uj5u.com熱心網友回復:
目前的網路情況是這樣, 往往幾百個peer能連上的就4,5個轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/284089.html
標籤:網絡編程
上一篇:VC++ :如何在滑鼠滾輪滾動時,不要滾動視窗的豎直滾動條
下一篇:VB呼叫迅雷開放下載組件例外!
