我模仿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卻看不出什麼問題 煩請各位先進若知道問題出在那裡,請給小弟建議,謝謝