全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2892
推到 Plurk!
推到 Facebook!

ClientSocket1Read收到資料缺少

缺席
show
初階會員


發表:57
回覆:48
積分:31
註冊:2003-05-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-24 14:58:36 IP:140.126.xxx.xxx 訂閱
我要實現LDAP中Fetch DNs部分...
我用wireshark錄到LDAP Browser中Fetch DNs的封包內容
我就模擬送這些封包...

在LDAP送回結果這段,因為長度很大,所以我發現ClientSocket1Read會被觸發兩次,一次長度44,一次長度57,比對封包內容44跟57中間還是漏掉很多
我查詢一些歷史資料...似乎很多人遇到,但我還是看不懂大家最後怎解決...有人說分段收...但我不太瞭解怎樣分段收,Socket->ReceiveBuf(buffer,len);不是已經全部收下來了嗎?

以下是code...

[code cpp]
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
//bindRequest
Byte *bf=new Byte[14];
bf[0]=0x30;
//....中間省略
bf[13]=0x00;
Socket->SendBuf(bf,14);
Sleep(1000);
Memo1->Lines->Add("bindRequest");
delete bf;
}
//--------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
Byte len=Socket->ReceiveLength();
Memo1->Lines->Add("長度:" IntToStr(len));
Byte *buffer=new Byte[len];
Socket->ReceiveBuf(buffer,len);

//bind成功,送出request
if(buffer[15]==0x0A && buffer[16]==0x01 && buffer[17]==0x00 )
{
Memo1->Lines->Add("searchRequest(2)");
Byte *bf=new Byte[55];
bf[0]=0x30;
bf[1]=0x35;
bf[2]=0x02;
//........中間省略
bf[54]=0x73;
Socket->SendBuf(bf,55);
Sleep(1000);
delete bf;
}
//LDAP server送回結果
if(
buffer[00]==0x30 &&
buffer[01]==0x84 &&
buffer[02]==0x00 &&
buffer[03]==0x00 &&
buffer[04]==0x00 &&
buffer[05]==0xc3
)
//印出內容
for(int i=0; i {
//result1=buffer[i];
result2=String(IntToHex(buffer[i],2));
//Memo1->Lines->Text=Memo1->Lines->Text result1;
Memo1->Lines->Add(result2);
//Memo1->Lines->Add(IntToStr(i) ":" IntToHex(buffer[i],2));
}
[/code]
show
初階會員


發表:57
回覆:48
積分:31
註冊:2003-05-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-24 15:41:12 IP:140.126.xxx.xxx 訂閱
自問自答...

我改這兩行
Byte *buffer=new Byte[len 1];
Socket->ReceiveBuf(buffer,len 1);

1後,就收到我要的資料了,但我還是不懂為什麼這樣就可以了?我len不是動態Socket->ReceiveLength();去得到嗎?
另外每一台AD的Base DN內容都不一樣...所以每次長度也都不一樣... 1應該不是完全解決...
編輯記錄
show 重新編輯於 2007-10-24 15:42:14, 註解 無‧
show
初階會員


發表:57
回覆:48
積分:31
註冊:2003-05-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-24 16:41:54 IP:140.126.xxx.xxx 訂閱
在自問自答...搞笑

剛剛連錯AD server...所以 1也是沒用的...

目前環境兩台AD,一台Base DN比較短,一台比較長,短的訊息都是對的...但連另外一台就會有錯誤...
shunchia63
高階會員


發表:26
回覆:141
積分:198
註冊:2007-05-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-24 18:53:24 IP:61.62.xxx.xxx 訂閱

delphi LDAP


http://cc.borland.com/Item.aspx?id=16879



or
.NET
System.DirectoryServices.DirectoryEntry();
System.DirectoryServices.DirectorySearcher();


會比較好嗎??
show
初階會員


發表:57
回覆:48
積分:31
註冊:2003-05-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-25 09:27:58 IP:140.126.xxx.xxx 訂閱
之前環境已經都是用BCB開發...所以沒辦法用delphi/.NET...
我之前也在找是否可以直接用現成function去呼叫...不過資料找不到,所以才用這種暴力方式硬上...

昨天換成Indy的TCPClient好像正常多了...

===================引 用 shunchia63 文 章===================

delphi LDAP


http://cc.borland.com/Item.aspx?id=16879



or
.NET
System.DirectoryServices.DirectoryEntry();
System.DirectoryServices.DirectorySearcher();


會比較好嗎??
系統時間:2024-04-27 11:57:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!