windows测试组播RTP丢包

场景描述:测试RTP数据包的丢失个数,应用于windows平台

// MultiCastRecv.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#include<windows.h>
#include <iostream>
using namespace std;

int InitSockLib()
{
    WORD wVersionRequested;
    WSADATA wsaData;
    int nret;
    wVersionRequested = MAKEWORD( 1, 1 );
    nret = WSAStartup( wVersionRequested, &wsaData );
    if ( nret != 0 ) {
        return -1 ;
    }
    if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
            WSACleanup( );
            return -2;
    }
    return 0;
}

int CreateMultiSock(char* pszMultiAddr,char* pszLocalIP,short sPort)
{
	int nret;
    if(InitSockLib()!=0)
    {
        cout<<"Can not Init Socket Lib"<<endl;
        return -1;
    }
    else
    {
        cout<<"Init Socket Lib successfully"<<endl;
    }
    struct ip_mreq SMreq;

    SOCKET SockServer=socket(AF_INET,SOCK_DGRAM,0);
    if(SockServer<0)
	{
        cout<<"Can not create socket"<<endl;
        return -2;
	}
	else
	{
        cout<<"create socket successfully"<<endl;
	}
    SOCKADDR_IN addrServer;
	short sRecvPort=16572;
    int addrLen=sizeof(struct sockaddr_in);
    memset(&addrServer,0,sizeof(struct sockaddr_in));
    addrServer.sin_family=AF_INET;
    addrServer.sin_port=htons(sPort);
    addrServer.sin_addr.S_un.S_addr=inet_addr(pszLocalIP);
	if(bind(SockServer,(struct sockaddr*)&addrServer,sizeof(struct sockaddr_in))<0)
	{
		printf("can not bind:%d,%d\n",WSAGetLastError(),sRecvPort);
		return -6;
	}
	else
	{
		cout<<"bind successfully"<<endl;
	}


    memset(&SMreq,0,sizeof(SMreq));
	nret = inet_pton(AF_INET,pszMultiAddr,&SMreq.imr_multiaddr.s_addr);
	if ( nret != 1 )
	{
		return -3;
	}
    SMreq.imr_interface.s_addr= htonl(INADDR_ANY);//double interface need to modify
	socklen_t ireuse=0;
	nret = setsockopt(SockServer,SOL_SOCKET,SO_REUSEADDR,(char*)&ireuse,sizeof(ireuse));
	if ( nret == -1)
	{
		cout<<"can not set reuse bindaddr"<<endl;
		return -4;
	}

	nret = setsockopt(SockServer,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&SMreq,sizeof(SMreq));
	if ( nret == -1)
	{
		return -5;
	}
    int nRecvLen=-1;
    char szRecvBuf[1500]={0};
    unsigned int nRTPLastSeq=0;
    unsigned int nRTPNowSeq=0;
    int nLostPackCount=0;
    while(1)
    {
        nRecvLen=recvfrom(SockServer,szRecvBuf,1500,0,(struct sockaddr*)&addrServer,&addrLen);
        nRTPNowSeq=szRecvBuf[2]%(0x100);
        nRTPNowSeq=(nRTPNowSeq*(0x100))+szRecvBuf[3];
        nLostPackCount=nRTPNowSeq-nRTPLastSeq;
        if(nLostPackCount!=1)
        {
            cout<<"Lost Pack count:"<<nLostPackCount<<",Now Recv Pack Seq:"<<nRTPNowSeq<<",The Last Seq:"<<nRTPLastSeq<<endl;
        }
        nRTPLastSeq=nRTPNowSeq;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
	char szMultiIP[32]={0};
	char szLocalIP[32]={0};
	short sPort=0;
	cout<<"Please input MultiIP:like:224.1.1.6"<<endl;
	cin>>szMultiIP;
	cout<<"Please input LocalIP:like:192.168.40.31"<<endl;
	cin>>szLocalIP;
	cout<<"Please input MultiAddr Port,which is from MultAddr"<<endl;
	cin>>sPort;
    CreateMultiSock(szMultiIP,szLocalIP,sPort);
	return 0;
}
				
时间: 2024-10-01 05:19:17

windows测试组播RTP丢包的相关文章

windows RT系统下解决网络丢包问题

windows RT为了保证最高的电池使用时间,电源选项只有节能模式,在节能模式下,无线网卡也处于低功耗状态,导致如果用windows RT系统做网络开发的同仁可能会遇到莫名其妙的丢包现象,要解决此问题,需要将无线网卡调整到高性能模式.但是windows RT系统禁止设置高性能,只能通过其他途径解决. 1.可以在命令行下使用powercfg -setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c命令将系统设置为高性能模式. 2.方法1可以将网卡设置为高性能

FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题--转

FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题 算法暂不介绍. 思路:FEC ENCODE 增加冗余包,当无线等网络丢包之后,接收端使用冗余包可将丢失的包DECODE出来. 举例:10个包,编码后会增加2个包,共12个包发送到接收端,接收端丢失第5和第9包,仅靠剩下的10个包就可以解出第5和第9包. 结果就是,接收端接收到了完整的10个包,代价仅仅是增加了冗余和cpu编解码的消耗. 参考: 1. RTP抗丢包传输方案 点击打

openStack 云平台管理节点管理网口流量非常大 出现丢包严重 终端总是时常中断问题调试及当前测试较有效方案

tuning for Data Transfer hosts connected at speeds of 1Gbps or higher <一.本次OpenStack系统调试简单过程简单记录> 1,dmesg 日志,丢包问题关键原因定位; [101231.909932] net_ratelimit: 85 callbacks suppressed 2,ethstatus -i p5p1 实时追踪网口TX/RX状态; 3,具体内核等相关参数调整 # recommended default co

libpcap丢包原理分析及Fedora 9 内核2.6.25.14下安装PF-RING的详细过程

看到网上有人讲解fedora 9下安装PF-RING的过程,都是几年前的了,比较老了,我安装PF-RING就是为了使用libpcap库,libpcap的原理是通过socket 将数据包从网卡 捕获数据包,然后在提交给应用程序,和winpcap很大的区别是,libpcap采用的是2个缓冲区,内核类似的一个乒乓操作,详细见我的庖丁解牛 --winpcap源码彻底解密一系列的文章.winpcap采用的是环状缓冲区,在winpcap下当网卡有数据到来时,npf.sys就会将数据拷贝 到内核缓冲区中,而内

客户端本地到服务器丢包的检查方法

如果用户本地到服务器出现ping丢包或直接无法连接的时候,可以通过如下步骤进行排查分析:   客户端本地到服务器丢包的检查方法 1. ping服务器IP地址或域名,查看丢包情况:     ping 140.205.140.234 -n 100  说明: -n 后面的数字表示要进行的ping测试次数: 主要关注如下下图所示所统计的丢包率和平均超时时间: 2. 使用MTR工具跟踪下到服务器的链路情况: Windows下,使用所示的WinMTR工具进行跟踪测试: 用法:打开软件后,在[hosts]框中

记录一个UDP收包丢包的问题

这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏. 分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分析了2个小时的解包函数后,没有发现问题.将抓包RTP负载中的PS包数据导出之后,专门利用PS解包代码写了一个小程序,对导出的数据进行处理,又没有问题——后来事实证明解包代码的确没有问题,而且这部分的代码是在其他项目中用过的.自己有些迷糊了,一时想不明白问题出在哪里. 起身转了几圈冷静后分析一下,认为

Linux UDP严重丢包问题的解决

测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈Buffer太低所致,于是先看看默认情况: sysctl -a |grep net.core 发现 net.core.rmem_max = 131071 net.core.rmem_default = 112640 修改吧,变大一点,变成10M,然后reboot(应该重启某个服务即可) 然后查网卡收包

Android IOS WebRTC 音视频开发总结(八十七)-- WebRTC中丢包重传NACK实现分析

本文主要介绍WebRTC中丢包重传NACK的实现,作者:weizhenwei ,文章最早发表在编风网,微信ID:befoio 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 在WebRTC中,前向纠错(FEC)和丢包重传(NACK)是抵抗网络错误的重要手段.FEC在发送端将数据包添加冗余纠错码,纠错码连同数据包一起发送到接收端:接收端根据纠错码对数据进行检查和纠正.RFC5109[1]定义FEC数据包的格式.NA

sendto频率过快导致发送丢包

编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络环境:1000M,直连,多网卡 系统:Linux version 3.19.0 接收模式:udp模式的raw socket(优化的话,可以直接通过网卡处理) 发送模式:udp模式的raw socket(优化的话,可以直接通过网卡处理),单线程/多线程 2M               1转N 设备A   ---------------->   转发设备