srt-master下sendfile

根據srt-master提供文件收發Demo(sendfile,recvfile)

1.構建發送服務

./sendfile

username@Ubuntu:~/srt/srt-master$ ./sendfile
server is ready at port: 9000

2.構建接收服務

sample-usage: recvfile server_ip server_port remote_filename local_filename

./recvfile 4.25.10.131 9000 output.ts output-tes.ts

3.接收完成流程

username@username-VirtualBox:~/workspace/srt-master$ ./recvfile 4.25.10.131 9000 output.ts output-tes.ts
09:00:41.797566/recvfile.N: SRT.c: Connection established to: 4.25.10.131:9000
speed = 0.0100161Mbits/sec
loss = 0pkt (0%)

 

接收完成後會在接收方存儲一份output-tes.ts文件,此Demo主要實現srt的接收和發送流程,簡單的調用srt-api實現。

#ifndef _WIN32
void* sendfile(void* usocket)
#else
DWORD WINAPI sendfile(LPVOID usocket)
#endif
{
   SRTSOCKET fhandle = *(SRTSOCKET*)usocket;
   delete (SRTSOCKET*)usocket;

   // aquiring file name information from client
   char file[1024];
   int len;

   if (SRT_ERROR == srt_recv(fhandle, (char*)&len, sizeof(int)))
   {
      cout << "recv: " << srt_getlasterror_str() << endl;
      return 0;
   }

   if (SRT_ERROR == srt_recv(fhandle, file, len))
   {
      cout << "recv: " << srt_getlasterror_str() << endl;
      return 0;
   }
   file[len] = '\0';

   // open the file (only to check the size)
   fstream ifs(file, ios::in | ios::binary);

   ifs.seekg(0, ios::end);
   int64_t size = ifs.tellg();
   //ifs.seekg(0, ios::beg);
   ifs.close();

   // send file size information
   if (SRT_ERROR == srt_send(fhandle, (char*)&size, sizeof(int64_t)))
   {
      cout << "send: " << srt_getlasterror_str() << endl;
      return 0;
   }

   SRT_TRACEBSTATS trace;
   srt_bstats(fhandle, &trace, true);

   // send the file
   int64_t offset = 0;
   if (SRT_ERROR == srt_sendfile(fhandle, file, &offset, size, SRT_DEFAULT_SENDFILE_BLOCK))
   {
      cout << "sendfile: " << srt_getlasterror_str() << endl;
      return 0;
   }

   srt_bstats(fhandle, &trace, true);
   cout << "speed = " << trace.mbpsSendRate << "Mbits/sec" << endl;
   int losspercent = 100*trace.pktSndLossTotal/trace.pktSent;
   cout << "loss = " << trace.pktSndLossTotal << "pkt (" << losspercent << "%)\n";

   srt_close(fhandle);

   //ifs.close();

   #ifndef _WIN32
      return NULL;
   #else
      return 0;
   #endif
}

發送文件主要調用srtcore,srt_c_api.c中的srt_sendfile接口

接收文件主要調用srtcore,srt_c_api.c中的srt_recvfile接口

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章