TClientSocket 收資料 |
答題得分者是:gemi0305
|
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
請問各位:
我要分二次收取資料,但第一次為9byte,第二次長度為fpBuf.Length(就是依照第一指定長度),分析好,在去檢查還沒有資料~ 結果無法收到資料,但確定有資料送進來~ 請大家指導~先謝謝各位
//--------------------------------------------------------------------------- void __fastcall TfrmAdmin::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { //the function process data write to buffer by socket int len; char *buffer,CRC; Front_Pack fpBuf; AnsiString tes; while(1) { len = Socket->ReceiveBuf(buffer,sizeof(fpBuf)); if(len == 0) return; else Application->MessageBox("df","Dfd",MB_OK); memmove((char *)&fpBuf,(char *)buffer,sizeof(fpBuf)); if(fpBuf.Leading == Header) { Socket->ReceiveBuf(buffer,fpBuf.Length sizeof(CRC) sizeof(Trailer)); if(*(buffer fpBuf.Length 1) == Trailer) ClientSocket1->Active = false; switch(fpBuf.Type) { case echo_online: char CODE; CODE = buffer[0]; if(CODE != 0x00) { frmAdmin->PageControl1Change(Sender); Echo_Message("online success"); } else { ClientSocket1->Active = false; Echo_Message("GServer reject online"); } break; case GDT_info: int i; char BOXID[MAX_ID]; bool gflag; gflag = true; memmove((char *)&BOXID,(char *)buffer,sizeof(BOXID)); for(i=0;i發表人 - kenbcb 於 2003/08/22 09:30:19 |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
kenbcb你好,
你的程式中引用了很多你沒附上的東西,
如結構等等~
所以我只有照所看得出來,覺得是錯誤的地方,提出來讓你參考 < class="code">
void __fastcall TfrmAdmin::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
//the function process data write to buffer by socket int len;
char *buffer,CRC;
Front_Pack fpBuf;
AnsiString tes;
while(1) //while(true)=無窮迴圈,而且你程式中也沒對應的break
//此程式會一直跑這個迴圈無法做其他事,lock在這個迴圈裡
{
len = Socket->ReceiveBuf(buffer,sizeof(fpBuf)); //此行已把資料收到buffer中了 if(len == 0) return;
else Application->MessageBox("df","Dfd",MB_OK); memmove((char *)&fpBuf,(char *)buffer,sizeof(fpBuf)); if(fpBuf.Leading == Header)
{
Socket->ReceiveBuf(buffer,fpBuf.Length sizeof(CRC) sizeof(Trailer));
//之前已收過資料,所以現在會到空的,你會看到buffer有資料是因為之前收的,
//但長度不會是fpBuf.Length sizeof(CRC) sizeof(Trailer)
//會是之前收的sizeof(fpBuf) if(*(buffer fpBuf.Length 1) == Trailer) ClientSocket1->Active = false; switch(fpBuf.Type)
{
case echo_online:
char CODE;
CODE = buffer[0];
if(CODE != 0x00)
{
frmAdmin->PageControl1Change(Sender);
Echo_Message("online success");
}
else
{
ClientSocket1->Active = false;
Echo_Message("GServer reject online");
}
break; case GDT_info:
int i;
char BOXID[MAX_ID];
bool gflag;
gflag = true;
memmove((char *)&BOXID,(char *)buffer,sizeof(BOXID));
//sizeof(BOXID)只是指這個BOXID指標的大小,值會是4,是錯的
//你要的應該是buffer的大小--sizeof(fpBuf)或是
//BOXID[]陣列的大小 MAX_ID 或是??...但決不會是這個指摽的大小
//以下所有sizeof(指標) 也同此意。
for(i=0;i
|
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
這是bcb online help上TWinSocketStream的範例,
滿好用的,我都從上面小改一下就可以直接用,
你如果要做blocking,但對TWinSocketStream不熟,先k一下這些東西,
This example shows the execute method of a thread used to send requests to a server over a socket connection: void __fastcall TMyClientThread::Execute() { // create a TWinSocketStream for reading and writing TWinSocketStream *pStream = new TWinSocketStream(ClientSocket1->Socket, 60000); try { // fetch and process commands until the connection or thread is terminated while (!Terminated && ClientSocket1->Active) { try { char buffer[10]; GetNextRequest(buffer); // GetNextRequest must be a thread-safe method // write the request to the server pStream->Write(buffer, strlen(buffer) 1); // continue the communication (eg read a response from the server) ... } catch (Exception &E) { if (!E.ClassNameIs("EAbort")) Synchronize(HandleThreadException()); // you must write HandleThreadException } } } __finally { delete pStream; } }國泰平安 |
kenbcb
中階會員 發表:171 回覆:129 積分:60 註冊:2003-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |