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

TClientSocket 收資料

答題得分者是:gemi0305
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-21 13:30:06 IP:61.222.xxx.xxx 未訂閱
請問各位: 我要分二次收取資料,但第一次為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;iCells[i%sgrdGMap->ColCount][i/sgrdGMap->ColCount] =
                                                         (AnsiString)GDT[i].ID;
             break;            case pclient_info:
             int j;
             char ID[MAX_ID];
             bool pflag;
             pflag = true;
             memmove((char *)&ID,(char *)buffer,sizeof(ID));
             for(j=0;jCells[j%sgrdPMap->ColCount][j/sgrdPMap->ColCount] =
                                                     (AnsiString)Pclient[j].ID;
             }
             break;            case ACK:
             break;
        case NCK:
             break;
        default:
             break;
      }
    }
  }
}
//--------------------------------------------------------------------------- 
發表人 - kenbcb 於 2003/08/22 09:30:19
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-21 23:33:29 IP:61.224.xxx.xxx 未訂閱
kenbcb你好,    請用「插入程式碼」的方式再po一次,就是用上面的「#」字按鈕, 可能平時白天上班code看太多了,晚上看到這些沒縮排的code, 自認眼力不錯的我,都有點眼花~ > < 我想您也有感覺吧~ 為了更快讓版上的人幫你解決問題,請重po吧,     等重po之後,我會將這篇主題砍掉 國泰平安
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-23 00:01:38 IP:61.224.xxx.xxx 未訂閱
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;iCells[i%sgrdGMap->ColCount][i/sgrdGMap->ColCount] = (AnsiString)GDT[i].ID; break; case pclient_info: int j; char ID[MAX_ID]; bool pflag; pflag = true; memmove((char *)&ID,(char *)buffer,sizeof(ID)); for(j=0;jCells[j%sgrdPMap->ColCount][j/sgrdPMap->ColCount] = (AnsiString)Pclient[j].ID; } break; case ACK: break; case NCK: break; default: break; } } } } 國泰平安
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-24 10:11:16 IP:61.222.xxx.xxx 未訂閱
不好意思~我改過了,還是不行,感覺程式好像沒有進入clientsocket的onRead的事件,但資料有進來(用sniffer看的)~ 請問各位都是如何做接收的 ps.Client Type is ctBlocking
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-25 09:01:26 IP:210.66.xxx.xxx 未訂閱
如果你是用blocking的話,onRead事件是不會幫你收資料的, 要用TWinSocketStream才行。    blocking在傳資料後,會被block住,直到回應, 如果沒什麼特別用殊,你又對blocking的寫法不熟, 使用nonblocking會比較好 國泰平安
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-25 09:13:34 IP:210.66.xxx.xxx 未訂閱
這是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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-25 11:12:39 IP:61.222.xxx.xxx 未訂閱
謝謝幫忙~我有用成功了
系統時間:2024-05-04 14:48:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!