自己嘗試用delphi寫出一個模擬方法,但是通過我自己這種模擬封包的方式只能發送10個封包過去服務器是會接受的,到第11個封包就被服務器拒絕了,自己也不了解tcp協議方面的知識。
請教一下大家,應該如何去模擬這樣的一個協議,讓他可以正常的接收。
希望高手們可以告訴我應該從哪一方面入手學習與如何模擬這樣的封包,謝謝!
我發一下自己的delphi代碼
代碼可能有點亂,服務器連接代碼我沒貼上來,我的具體步驟就是。
連接斗魚的聊天服務器,然后發送匿名的登錄封包與心跳包模擬訪問(封包都是通過wpe截取下來的明文封包,我就模擬這樣的一個明文封包處理登錄),但是我的這樣模擬只可以有10個連接數,第11個就被拒絕連接。
procedure TForm1.Button4Click(Sender: TObject);
var
RequestStr,BackStr:string;
username:string;
password:string;
time:string;
RoomID:string;
salt:string;
uuid:string;
vk:string;
p:string;
t1,t2:string;
begin
username:='';
password:='';
time:=IntToStr(DateTimeToUnix(Now)-8*60*60);//時間戳
RoomID:=Edit1.Text;//房間號
salt:='7oE9nPEG9xXV69phU31FYCLUagKeYtsF';//未知值
uuid:=uuidsetup();//16個16進制的隨機位元組數
vk:=StrToMD5(time+salt+vk);//未知值
{p:='type@=loginreq/username@=/password@=/roomid@='+RoomID+'/ct@=2/devid@='+uuid+'/ver@=20150505/rt@='+time+'/vk@='+vk+'/';}
t1:=hextostring('B8000000B8000000B1020000');
t2:=hextostring('00');
p:=t1+'type@=loginreq/'+
'username@='+username+'/password@='+password+'/roompass@=/roomid@='+
RoomID+'/devid@='+uuid+'/rt@='+time+'/vk@='+vk+'/ver@=20150929/ct@=0/'+t2;
//memo1.Lines.Add(p);}
if socket.Connected then
begin
RequestStr:=p;
try
socket.RecvBufferSize
socket.Write(RequestStr);//發送登錄封包
Memo1.Lines.Add('發送資料:'+RequestStr);
{t1:=hextostring('1F0000001F000000B1020000');
RequestStr:=t1+'type@=qrl/rid@='+RoomID+'/'+t2;}
{首次心跳包}
t1:=hextostring('5B0000005B000000B1020000');
p:=t1+'type@=keeplive/tick@='+time;
time:=IntToStr(DateTimeToUnix(Now)-8*60*60);
vk:=StrToMD5(time+salt+vk);
p:=p+'/vbw@=0/cdn@=0/k@='+vk+'/'+t2;
{首次心跳包}
socket.Write(p);//首次心跳
BackStr:=socket.ReadLn('',500); //實際上timeout是不起作用的,indy本身
//的bug;此時如果server端無資料則會死等
Memo1.Lines.Add('回傳資料:'+BackStr);
while (True) Do
begin
t1:=hextostring('5B0000005B000000B1020000');
time:=IntToStr(DateTimeToUnix(Now)-8*60*60);
vk:=StrToMD5(time+salt+vk);
sleep(10000);
p:=t1+'type@=keeplive/tick@='+time+'/vbw@=0/cdn@=0/k@='+vk+'/'+t2;
socket.Write(p);
Memo1.Lines.Add('發送資料:'+p);
BackStr:=socket.ReadLn('',500); //實際上timeout是不起作用的,indy本身
//的bug;此時如果server端無資料則會死等
Memo1.Lines.Add('回傳資料:'+BackStr);
end;
except
ShowMessage('發送資料失敗!');
end;
end
else
begin
Memo1.Lines.Add('連接已被斷開,無法發送!');
end;
uj5u.com熱心網友回復:
這里是C/C++專區,dephi專區請出門左轉。。uj5u.com熱心網友回復:
我也會C和C++,只是自己用了delphi寫的,我只是求一個http與tcp協議的模擬原理,代碼其實都大同小異!
uj5u.com熱心網友回復:
你這是一個連接發了10次登錄包?uj5u.com熱心網友回復:
10次連接10個包,第11次連接發送封包就被拒。
uj5u.com熱心網友回復:
斗魚一個埠限制10連接。uj5u.com熱心網友回復:
你那邊有網路人氣協議嗎
uj5u.com熱心網友回復:
github上有C的原始碼,建議直接呼叫C編譯的DLL或有實際需要的將C轉DELPHI
直接上www.github.com搜索serversocket
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/32582.html
標籤:網絡通信/分布式開發
上一篇:分享1個N進制轉十進制的
下一篇:分享1個十進制轉N進制的功能。
