次のコードは、実際に別のファイルで受信する場合、同じファイル("/ tmp/frame")、 のデータを引き続き受信します。 サーバーがファイルの受信を開始し、閉じず、次のファイルのデータを引き続き受信しているようです。ソケット転送でファイルが無限のデータを受信し続ける
(コード内のコメントは、問題を解決しますが、ファイルの転送を遅らせる)
送信者:
screenshot ptr_screen;
CHAR Block[4096], buffer[512];
int BytesRead, iResult;
for (;;) {
memset(Block, 0, sizeof(Block));
memset(buffer, 0, sizeof(buffer));
ptr_screen.Start();
FILE *fp = fopen("screen.jpg", "rb");
if (!fp) { break; }
fseek(fp, 0, SEEK_END);
int32_t file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);
iResult = send(socket_, (char*)&file_size, sizeof(file_size), 0);
if (iResult == SOCKET_ERROR) { fclose(fp); break; }
while (file_size > 0) {
BytesRead = fread(Block, 1, sizeof(Block), fp);
if (BytesRead <= 0) { break; }
iResult = send(socket_, Block, BytesRead, 0);
if (iResult != BytesRead) { break; }
file_size -= BytesRead;
}
fflush(fp);
fclose(fp);
//if (recv_to(socket_, buffer, sizeof(buffer), 0, 5000) <= 0)
//break;
}
受信機:
int iResult;
char Block[512];
int32_t file_size;
for(;;) {
FILE* fp = fopen("/tmp/frame", "wb");
if(!fp) { break; }
memset(Block, 0, sizeof(Block));
iResult = recv_to((char*)&file_size, sizeof(file_size), 10);
if(iResult <= 0) { break; }
while(file_size > 0) {
iResult = recv_to(Block, sizeof(Block), 10);
if(iResult <= 0) { break; }
if(fwrite(Block, 1, iResult, fp) != (unsigned)iResult) { return; }
file_size -= iResult;
}
fclose(fp);
system("mv /tmp/frame /tmp/stream.jpg");
//send(socket_, "OK", strlen("OK"), 0); // response
}
Linuxサーバーの例を教えてもらえますか? –
何の例ですか? –
どうすればこのコードをrecv_to(block、sizeof(Block)、10)に変更できますか? 私はこの問題を抱えていませんか? –