Created
October 23, 2015 20:13
-
-
Save hapo31/0f6d2d6ba5c9d624916b to your computer and use it in GitHub Desktop.
JRTPLIB Run Test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "rtpsession.h" | |
#include "rtppacket.h" | |
#include "rtpudpv4transmitter.h" | |
#include "rtpipv4address.h" | |
#include "rtpsessionparams.h" | |
#include "rtperrors.h" | |
#include "rtpmemorymanager.h" | |
#ifndef WIN32 | |
#include <netinet/in.h> | |
#include <arpa/inet.h> | |
#else | |
#include <winsock2.h> | |
#pragma comment(lib, "ws2_32.lib") | |
#endif // WIN32 | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <iostream> | |
#include <string> | |
#include <chrono> | |
#include <thread> | |
using namespace jrtplib; | |
using namespace std::chrono; | |
void checkerror(int rtperr) | |
{ | |
if (rtperr < 0) | |
{ | |
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl; | |
exit(-1); | |
} | |
} | |
int main(int argc, char** argv) | |
{ | |
#ifdef WIN32 | |
WSADATA dat; | |
WSAStartup(MAKEWORD(2, 2), &dat); | |
#endif // WIN32 | |
//引数が足りない時は使い方を表示 | |
if (argc <= 2) | |
{ | |
std::cout << "Usage:\njrtpdriver destip destport srcport" << std::endl; | |
return 0; | |
} | |
RTPSession sess; | |
uint16_t portbase, destport; | |
uint32_t destip; | |
int status; | |
#ifndef WIN32 | |
destip = inet_addr(argv[1]); | |
#else | |
{ | |
struct in_addr addr; | |
InetPtonA(AF_INET, argv[1], &addr); | |
destip = addr.S_un.S_addr; | |
} | |
#endif | |
//変なIPアドレスだよ | |
if (destip == INADDR_NONE) | |
{ | |
std::cerr << "Bad IP address specified" << std::endl; | |
return -1; | |
} | |
//ネットワークバイトオーダーへ変換 | |
destip = ntohl(destip); | |
//ポートを数値へ変換 | |
destport = static_cast<uint16_t>(std::stoi(argv[2])); | |
portbase = static_cast<uint16_t>(std::stoi(argv[3])); | |
RTPUDPv4TransmissionParams transparams; | |
RTPSessionParams sessparams; | |
//RTCPも使って正確に同期を取りたい時に使う値 ここでは使わないけど一応設定 | |
sessparams.SetOwnTimestampUnit(1.0 / 10.0); | |
//よくわかんないけど例にあるのでtrue | |
sessparams.SetAcceptOwnPackets(true); | |
//RTPUDP以下略のインスタンスにportを設定 ここで設定したポートが送信時に使われる | |
transparams.SetPortbase(portbase); | |
//RTPSessionのインスタンスに値を設定 | |
status = sess.Create(sessparams, &transparams); | |
checkerror(status); | |
//アドレスに関する値を設定 | |
RTPIPv4Address addr(destip, destport); | |
//RTPSessionインスタンスに適用 これで通信が開始される | |
status = sess.AddDestination(addr); | |
checkerror(status); | |
std::cout << "start RTP..." << std::endl; | |
int n = 0; | |
//死にたいときはCtrl+Cとかで死んでね☆ | |
while (true) | |
{ | |
//データを送る 数字も入れてみたりする | |
std::string buf = std::to_string(n) + ":Hello World!!!!!!!!!!!!!"; | |
++n; | |
status = sess.SendPacket(buf.c_str(), buf.length(), 0, false, 10); | |
checkerror(status); | |
//JRTPTHREADを使う場合はこれがいらないらしい 今回は使ってないので必要 | |
sess.Poll(); | |
//パケットデータを取得するときはこいつを実行してバッファをブロッキングする | |
sess.BeginDataAccess(); | |
if (sess.GotoFirstSourceWithData()) | |
{ | |
do | |
{ | |
RTPPacket *pack; | |
while ((pack = sess.GetNextPacket()) != nullptr) | |
{ | |
//受信したパケットの内容を知りたい場合はGetPayloadData()を使う | |
char* p = reinterpret_cast<char*>(pack->GetPayloadData()); | |
//パケットの長さを知るにはGetPayloadLength()を使う なんでvectorとかじゃなかったんだろう | |
std::string recv_str(p, p + pack->GetPayloadLength() - 1); | |
//受信したデータを表示 | |
std::cout << recv_str << std::endl; | |
//使い終わったパケットはDeleteしましょう | |
sess.DeletePacket(pack); | |
} | |
} while (sess.GotoNextSourceWithData()); | |
} | |
//データ取得を終了するときはこいつでブロッキングを解除 | |
sess.EndDataAccess(); | |
//0.5秒待つ | |
std::this_thread::sleep_for(milliseconds(500)); | |
} | |
sess.BYEDestroy(RTPTime(10, 0), 0, 0); | |
#ifdef WIN32 | |
WSACleanup(); | |
#endif // WIN32 | |
return 0; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment