// RTPReceiver.cpp
#include "RTPReceiver.h"
#include<iostream>
using namespace std;
#pragma comment(lib, "pthreadVC2.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
#define HOST_IP "192.168.2.100"
#define HOST_PORT 1430
#define RECEIVED_STR "RECEIVED"
void Callback_RtpPacket(char *buffer, int len)//函数
{
//解析
RTPReceiver::rtp_msg_t *prtp = (RTPReceiver::rtp_msg_t*)buffer;
if (prtp->header.version != 2) {
len = 0;
return;
}
printf("RTP Header Analysis -------------!!! \n");
printf("[Callback_RtpPacket] cc-----%d \r\n", prtp->header.cc);
printf("[Callback_RtpPacket] x-----%d \r\n", prtp->header.x);
printf("[Callback_RtpPacket] m-----%d \r\n", prtp->header.m);
printf("[Callback_RtpPacket] pt-----%x \r\n", prtp->header.pt);
printf("[Callback_RtpPacket] p-----%d \r\n", prtp->header.p);
printf("[Callback_RtpPacket] version-----%d\r\n ", prtp->header.version);
printf("[Callback_RtpPacket] seq-----%d \r\n", prtp->header.seq);
printf("[Callback_RtpPacket] ts-----%d \r\n ", prtp->header.ts);
printf("[Callback_RtpPacket] ssrc-----%d \r\n", prtp->header.ssrc);
printf("[Callback_RtpPacket] payload=%s\r\n", prtp->body);
}
typedef void(*pCallback_RtpPacket)(char *buffer, int len);
pCallback_RtpPacket m_RtpDataFunc = Callback_RtpPacket; //回调函数/函数指针
BOOL thread_running;
using namespace std;
void * thr_fn(void * arg)
{
thread_running = true;
RTPReceiver *pthis = (RTPReceiver*)arg;
pthis->thread_recv_func();
return (void *)0;
}
int RTPReceiver::thread_create()
{
pthread_attr_t attr;
pthread_mutex_init(&m_real_rtp_mutex, NULL);
int ret = -1;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&thread, &attr, thr_fn, this);
if (0 != ret)
{
printf("receive thread_create err ret =%d ", ret);
return -1;
}
else
{
printf("receive thread_create success!\n ");
return 0;
}
}
void RTPReceiver::thread_destory()
{
thread_running = false;
//thread 退出代码
pthread_join(thread, NULL);
printf("thread destoryed!\n");
}
/*********************************************TCP************************************************/
int RTPReceiver::thread_recv_func()
{
WSADATA wsd = { 0 };
int status_Code = WSAStartup(MAKEWORD(1, 1), &wsd); //返回0成功
cout << "WSAStartup status_Code :" << status_Code << endl;
if (status_Code != 0)
{
cout << "WSAStartup failed" << endl;
return status_Code;
}
SOCKET m_sockServer;
sockaddr_in server_addr;
sockaddr_in server_addr_from;
SOCKET m_server[20];
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(9999);
server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
m_sockServer = socket(AF_INET, SOCK_STREAM, 0);
int iConnect = 0;
const int bufSize = 65535;
char packetbuffer[bufSize];
char sendBuf[1024]="had received!";
int i = bind(m_sockServer, (sockaddr*)&server_addr, sizeof(server_addr));
if (i != SOCKET_ERROR)
{
cout << "bind success i=" << i << endl;
int iMaxConnect = 20;
int lis_code;
int len = sizeof(sockaddr); //sockaddr 是系统变量
while (thread_running)
{
lis_code = listen(m_sockServer, 0); //进行监听 监听等待队列100
//if (lis_code == -1)
//{
// cout << "listen failed!!!! lis_code-->" << lis_code << endl;
// return lis_code;
//}
m_server[iConnect] = accept(m_sockServer, (sockaddr*)&server_addr_from, &len);//同意建立连接
if (m_server[iConnect] != INVALID_SOCKET)
{
iConnect++;
if (iConnect>iMaxConnect)
{
cout << "more than max connect !!! status_Code---" << status_Code << endl;
return status_Code;
}
else
{
cout << "iConnect--->" << iConnect << endl;
--iConnect;
while (thread_running)
{
int status_code = recv(m_server[iConnect], packetbuffer, bufSize, 0);
if (status_code != -1)
{
pthread_mutex_lock(&m_real_rtp_mutex);
m_RtpDataFunc(packetbuffer, status_code);
pthread_mutex_unlock(&m_real_rtp_mutex);
int status_code = send(m_server[iConnect], sendBuf, sizeof(sendBuf), 0);
if (status_code == SOCKET_ERROR)
{
cout << "send Notice failed!!! status_code:" << status_code << endl;
}
}
else
{
cout << " receive failed !!! status_code--->" << status_code << endl;
return status_code;
}
}
}
}
}//while
}
else
{
cout << "bind failed...i=" << i << endl;
return i;
}
closesocket(m_server[iConnect]);
WSACleanup();
return TRUE;
}
/************************************************************************************************/
//int RTPReceiver::thread_recv_func()
//{
// //the version bit of Winsock
// int version_a = 1;//low bit
// int version_b = 1;//high bit
// //makeword
// WORD versionRequest = MAKEWORD(version_a, version_b);
// WSAData wsaData;
// int err;
// //wsa startup
// err = WSAStartup(versionRequest, &wsaData);
// if (err != 0) {
// printf("ERROR!");
// return -1;
// }
// //check whether the version is 1.1, if not print the error and cleanup wsa?
// if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
// {
// printf("WRONG WINSOCK VERSION!");
// WSACleanup();
// return -1;
// }
//
// //build the socket
// m_real_rtp_sock = socket(AF_INET, SOCK_DGRAM, 0);
// SOCKADDR_IN addr_Srv;
// addr_Srv.sin_addr.S_un.S_addr = inet_addr(HOST_IP);
// addr_Srv.sin_family = AF_INET;
// addr_Srv.sin_port = htons(HOST_PORT);
//
// if (1)
// {
// int opt = SO_REUSEADDR;
// const char *popt = "1";
// err = setsockopt(m_real_rtp_sock, SOL_SOCKET, SO_REUSEADDR, popt, sizeof(opt));
// if (err == SOCKET_ERROR)//设置失败。
// {
// printf("set SO_REUSEADDR error %d\r\n", WSAGetLastError());
// }
// }
// //bind socket to the host
// int resbind = bind(m_real_rtp_sock, (SOCKADDR*)&addr_Srv, sizeof(SOCKADDR));
// if (resbind == SOCKET_ERROR)
// {
// printf("bind error %d\r\n", WSAGetLastError());
// }
// Sleep(1000);
//
// //address of a client
// SOCKADDR_IN addr_Clt;
// const int bufSize = 65535;
// char packetbuffer[bufSize];
//
// int fromlen = sizeof(SOCKADDR);
// while (thread_running)
// {
// unsigned long len = 1;
// //FIONREAD:确定套接口s自动读入的数据量,udp返回套接口上排队的第一个数据报大小
// //len=0设置成阻塞模式,len=1设置成非阻塞模式。
// ioctlsocket(m_real_rtp_sock, FIONREAD, &len);
// if (len <= 0)
// {
// Sleep(1000);
// continue;
// }
// while (thread_running && len > 0)
// {
// memset(packetbuffer, 0, bufSize);
// //receive data function of server
// int recvlen = recvfrom(m_real_rtp_sock, packetbuffer, bufSize, 0, (SOCKADDR*)&addr_Clt, &fromlen);
// if (recvlen != -1)
// {
// //cout << "recevie buffer is " << packetbuffer << endl;
// cout << "recevied buffer" << endl;
// }
// if (recvlen > 0 && m_RtpDataFunc)
// {
// pthread_mutex_lock(&m_real_rtp_mutex);
// m_RtpDataFunc(packetbuffer, recvlen);
// pthread_mutex_unlock(&m_real_rtp_mutex);
// }
// //send "OK" to the from_client to indicates that data have been received.
// sendto(m_real_rtp_sock, RECEIVED_STR, strlen(RECEIVED_STR) + 1, 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR));
// Sleep(10);
// }
//
// }
// closesocket(m_real_rtp_sock);
// WSACleanup();
// return TRUE;
//}
int main()
{
RTPReceiver *self = new RTPReceiver;
self->thread_create();
while (1)
{
Sleep(1);
}
self->thread_destory();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
RTP发送(TCP UDP两种方式)
共102个文件
sum:12个
tlog:12个
dll:9个
4星 · 超过85%的资源 需积分: 48 202 下载量 161 浏览量
2017-08-05
14:02:06
上传
评论 11
收藏 49.4MB RAR 举报
温馨提示
RTP发送、接收(采用TCP和 UDP两种方式)
资源推荐
资源详情
资源评论
收起资源包目录
RTP发送(TCP UDP两种方式) (102个子文件)
libpthreadGC2.a 91KB
libpthreadGCE2.a 91KB
libpthreadGC2.a 91KB
ANNOUNCE 14KB
IPC-Client.aps 1KB
README.Borland 3KB
BUGS 6KB
ChangeLog 196KB
CONTRIBUTORS 5KB
COPYING 6KB
RTPReceiver.cpp 8KB
RTPSender.cpp 7KB
README.CV 88KB
IPC-Client.VC.db 29.87MB
Browse.VC.db 28.71MB
Browse.VC.db 28.68MB
Wins-Server.VC.db 28.37MB
pthreadGC2.dll 182KB
pthreadGCE2.dll 119KB
pthreadGC2.dll 117KB
pthreadVC2.dll 81KB
pthreadVCE2.dll 61KB
pthreadVSE2.dll 56KB
pthreadVC2.dll 55KB
pthreadVC2.dll 55KB
pthreadVC2.dll 55KB
IPC-Client.exe 71KB
Wins-Server.exe 55KB
FAQ 18KB
IPC-Client.vcxproj.filters 1KB
Wins-Server.vcxproj.filters 1KB
pthread.h 43KB
sched.h 5KB
semaphore.h 5KB
RTPSender.h 1KB
RTPReceiver.h 1KB
resource.h 389B
vc141.idb 763KB
vc141.idb 747KB
IPC-Client.ilk 496KB
Wins-Server.ilk 441KB
RTPSENDER.ipch 57.69MB
RTPRECEIVER.ipch 57.31MB
Wins-Server.lastbuildstate 215B
IPC-Client.lastbuildstate 214B
pthreadVCE2.lib 30KB
pthreadVSE2.lib 30KB
pthreadVC2.lib 30KB
pthreadVC2.lib 29KB
COPYING.LIB 26KB
Wins-Server.Build.CppClean.log 1KB
IPC-Client.Build.CppClean.log 1KB
Wins-Server.log 230B
IPC-Client.log 222B
MAINTAINERS 99B
NEWS 42KB
README.NONPORTABLE 31KB
RTPSender.obj 110KB
RTPReceiver.obj 82KB
IPC-Client.pdb 532KB
Wins-Server.pdb 516KB
vc141.pdb 420KB
vc141.pdb 420KB
PROGRESS 142B
IPC-Client.rc 2KB
README 22KB
Wins-Server.sln 1KB
IPC-Client.sln 1KB
sha512.sum 2KB
sha512.sum 868B
sha512.sum 866B
md5.sum 799B
sha512.sum 558B
sha512.sum 429B
sha512.sum 428B
md5.sum 295B
md5.sum 293B
md5.sum 177B
md5.sum 144B
md5.sum 143B
.suo 57KB
.suo 54KB
.suo 38KB
.suo 31KB
CL.read.1.tlog 35KB
CL.read.1.tlog 35KB
link.read.1.tlog 4KB
link.read.1.tlog 4KB
link.command.1.tlog 1KB
link.command.1.tlog 1KB
CL.command.1.tlog 882B
CL.command.1.tlog 866B
CL.write.1.tlog 640B
CL.write.1.tlog 616B
link.write.1.tlog 604B
link.write.1.tlog 584B
IPC-Client.vcxproj.user 365B
IPC-Client.vcxproj 8KB
Wins-Server.vcxproj 7KB
README.Watcom 2KB
共 102 条
- 1
- 2
资源评论
- 碧海晴空2019-12-23资源还是不错的,有参考价值。
- q6015107172018-07-31资源很好,是我想要的
- lxyvslyr2020-08-06太假了,源码只有一些无关紧要的部分。打包,解包这些关键的地方都是二进制。 要这么高的积分,良心在哪里? 已举报!
- Rick_Bao2018-11-27谢谢分享!!!
- adream992017-08-10谢谢分享,学习中,希望有帮助!!
Stone_OverLooking
- 粉丝: 94
- 资源: 53
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功