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

BCB使用winsock傳送螢幕遇到的問題

缺席
dodolong
一般會員


發表:5
回覆:6
積分:2
註冊:2003-12-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-02 18:40:46 IP:140.129.xxx.xxx 未訂閱
我模仿RaynorPao大大的程式也寫了一個UDP的傳送螢幕程式 遇到了兩個問題,以下我先貼出我的程式碼    Client端
#include 
byte cSendTemp[1024];    ms1 = new TMemoryStream;
//hdc = ::GetWindowDC(0);
//::BitBlt(bmp->Canvas->Handle, 0, 0, Screen->Width, Screen->Height, hdc, 0, 0, SRCCOPY);    //使用jpg
jpg = new TJPEGImage;
//jpg->Assign(bmp);
//jpg->CompressionQuality=90;
//jpg->Compress();
jpg->LoadFromFile("01.jpg");
jpg->SaveToStream(ms1);    delete jpg;
//ReleaseDC(NULL, hdc);    // 呼叫 WSAStartup() 註冊 WinSock DLL 的使用
if ( WSAStartup( 0x101,&wsadata) != 0)
{
  ShowMessage("winsock_server: can't use WinSock DLL\n");
  exit(1);
}    // 開啟 UDP socket
if ( (cli_sd=socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
{
  ShowMessage("Winsock_server: can't open TCP socket\n");
  exit(1);
}    //指定 socket 的 IP 位址和 port number
cli.sin_family = AF_INET;
cli.sin_addr.s_addr = inet_addr(Edit1->Text.c_str());
cli.sin_port = htons(6010);
cli_len = sizeof(cli);    int iTotal=ms1->Size;
int iPacket=sizeof(cSendTemp);
int iTime=(iTotal%iPacket==0)? iTotal/iPacket: iTotal/iPacket 1;
//ShowMessage((AnsiString)iTime);
for(int i=0; iPosition=i*iPacket;
  int iLen1=(iRead(cSendTemp, iLen1);
  Sleep(10);
  if ( sendto( cli_sd, cSendTemp, strlen(cSendTemp)   1, 0, (LPSOCKADDR)&cli, cli_len) == SOCKET_ERROR)
  ShowMessage("SendToTest: send() error!\n");
  Sleep(10);
}    if ( sendto( cli_sd, 0, 0, 0, (LPSOCKADDR)&cli, cli_len) == SOCKET_ERROR)
  ShowMessage("SendToTest: send() error!\n");    closesocket(cli_sd);
WSACleanup();
Server端
#include 
byte cServTemp[1024];    // 呼叫 WSAStartup() 註冊 WinSock DLL 的使用
if ( WSAStartup( 0x101, (LPWSADATA)&wsadata) != 0 )
{
  ShowMessage("FileServer: can't use WinSock DLL\n");
  exit(1);
}    // 開啟 UDP socket
if ( ( serv_sd = socket( AF_INET, SOCK_DGRAM, 0) ) == SOCKET_ERROR)
{
  ShowMessage("FileServer: can't open TCP socket\n");
  exit(1);
}    // 指定 socket 的 IP 位址和 port number
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = 0;
serv.sin_port = htons(6010);    //將本機的資訊寫入serv結構中
if (( bind( serv_sd, (LPSOCKADDR)&serv, sizeof(serv))) == SOCKET_ERROR )
{
  ShowMessage("FileServer: can't bind local address\n");
  exit(1);
}    int count = 0;
jpg = new TJPEGImage;
serv_len = sizeof(serv);
Memo1->Lines->Add("Wait for clinet.....");
Memo1->Refresh();    //進入接收的while loop
while(1)
{
  ZeroMemory(&cServTemp, sizeof(cServTemp));
  n = recvfrom( serv_sd, cServTemp, 1024, 0, (LPSOCKADDR)&serv, &serv_len);      if ((n != 0)&&(n != SOCKET_ERROR))
  {
    ms1->Position = count*1024;
    ms1->Write(cServTemp,sizeof(cServTemp));
    count  ;
    //Memo1->Lines->Add((AnsiString)count);
  }
  if (n == 0)
  {
    Memo1->Lines->Add("Transmite completed!");
    Memo1->Realign();
    closesocket(serv_sd);
    break;
  }
  else if ( n == SOCKET_ERROR)
  {
      ShowMessage("FileServer: recv() error!");
      closesocket(serv_sd);
      break;
  }
    ms1->Position = 0;
    jpg->LoadFromStream(ms1);
    jpg->SaveToFile("01.jpg");
    Memo1->Refresh();
}
WSACleanup();
以上是我的程式碼,我遇到了兩個問題,麻煩各位先進為我解答 1. 當我Server端接收到所有封包的時候,n(recvfrom()的回傳值)值都異常的小,但我看Client端的cSendTemp array裡卻是每個field幾乎都有值,但Server端的cServTemp array卻不是如此,不知道是為什麼? 2. 我想說先不管收到的data,想說直接拼起來看看是如何,但卻發生了Error,錯誤訊息是JPEG error #67,錯誤似乎是發生在Server端最末幾行的jpg->LoadFromStream(ms1),這個錯誤發生時我有給ms1->Size,但當我沒有給ms1->Size時,發生了JPEG error #50,上google查到的Errorcodes卻看不出什麼問題 煩請各位先進若知道問題出在那裡,請給小弟建議,謝謝
dodolong
一般會員


發表:5
回覆:6
積分:2
註冊:2003-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-04 01:10:40 IP:61.216.xxx.xxx 未訂閱
我自己找到問題出在哪裡了 1. Client端的sento()函式不能用strlen()來計算buffer大小,我用了sizeof()就沒問題了... 至於buffer用byte或char型態都可以... 2. Server端的從ms1->Position = 0;起3行必須移至while loop外(真是愚蠢的致命傷啊) 目前的結果在bcb裡用winsock以這樣的方式傳圖檔或直接抓螢幕再傳都沒有問題了...
系統時間:2024-05-13 16:39:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!