设为首页 收藏本站
查看: 903|回复: 0

[经验分享] windows测试组播RTP丢包

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-9-25 13:23:59 | 显示全部楼层 |阅读模式
场景描述:测试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;

}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-25396-1-1.html 上篇帖子: Windows Server 2012 安装.NET Framework 3.5报错 下篇帖子: Windows 无法安装到这个磁盘。选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘 windows
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表