p2p协议(webrtc编译)

p2p优势

多个客户端连接服务端,通过单一的服务端转发数据,服务端压力太大,所以使用p2p,以服务端为媒介,两个客户端做直连,服务端的压力会减小很多。内网和外网隔离的限制,p2p在内网和外网使用的协议不同,p2p在外网和内网间会更为复杂。网上有很多p2p的简单实现,大多是针对内网的

跨网段编程

tcp 在lan和wan之间通信,路由器(三层交换机,转发ip层数据)默认根据ip协议中的ip地址,查找路由表中的数据,并转发下一级,找到目标并回传回来
外网云服务器在配置了安全访问规则和设置防火墙允许后可以直接ping通外网不同网段的地址

路由跟踪

ping使用icmp协议测试目标电脑通断,限制在相同冲突域内(外网ping不同)
tracert和ping命令一样测试目标电脑通断,但支持路由跟踪
pathping,综合了ping和tracert命令

//定义ICMP首部
typedef struct _icmphdr{
  unsigned char i_type; //8位类型
  unsigned char i_code; //8位代码
  unsigned short i_cksum; //16位校验和, 从TYPE开始,直到最后一位用户数据,如果为字节数为奇数则补充一位
  unsigned short i_id ; //识别号(一般用进程号作为识别号), 用于匹配ECHO和ECHO REPLY包
  unsigned short i_seq ; //报文序列号, 用于标记ECHO报文顺序
  unsigned int timestamp; //时间戳
}ICMP_HEADER;

假设A路由器PING B路由器,A路由器会先发一个ICMP ECHO报文(TYPE=8,CODE=0),如果2台设备 之间路由是可达的,B收到后会回一个ICMP REPLY的报文(TYPE=0,CODE=0)
ICMP code值:

  • 0 = net unreachable
  • 1 = host unreachable
  • 2 = protocol unreachable
  • 3 = port unreachable
  • 4 = fragmentation needed and DF set
  • 5 = source route failed

ip协议中的ttl,系统默认ttl=64(最大路由链接数)
tracert控制ttl=1递增遍历路由,假设A是一台PC机,由A来TRACERT B,A首先会发送一个ICMP ECHO的报文(TYPE=8,CODE=0), 并且该报 文的TTL=1,第一个路由器收到后会丢弃该报文不转发,并返回一个ICMP超时的报文(TYPE=11,CODE=0),然后A会在发送一个ICMP ECHO的报文,这时TTL=2,下一个路由器收到后又回一个ICMP超时报文。当报文到达B后,B会回给A一个ICMP端口不可达的报文(TYPE=3,CODE=3)

webrtc

webrtc网页即时通信(Web Real-Time Communication),web模式的流媒体服务器(用户操作交互rtmp、rtsp、http等协议的服务器,ffmpeg推流到流媒体服务器)
地址:https://gitee.com/hezikj/webrtc
使用ninja(build.ninja配置文件)、gn(.gn配置文件)编译

  • gn args 目录 --list 查看可以配置的参数
  • gn args 目录生成项目ninja.build
  • 或者gn gen out/Debug
  • ninja [build] -C out/Debug

github上面找到的webrtc配置很多有问题,没有cmake好用,好在build.gn配置中的文件依赖关系结构清晰,可以直接自己构建CMake项目,不用gn编译

cmake函数在abseil-cpp项目中找到的,可以按照gn的结构改写成cmake

function(absl_cc_test)
  if(NOT ABSL_RUN_TESTS)
    return()
  endif()

  cmake_parse_arguments(ABSL_CC_TEST
    ""
    "NAME"
    "SRCS;COPTS;DEFINES;LINKOPTS;DEPS"
    ${ARGN}
  )

  set(_NAME "absl_${ABSL_CC_TEST_NAME}")

  add_executable(${_NAME} "")
  target_sources(${_NAME} PRIVATE ${ABSL_CC_TEST_SRCS})
  target_include_directories(${_NAME}
    PUBLIC ${ABSL_COMMON_INCLUDE_DIRS}
    PRIVATE ${GMOCK_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS}
  )

  if (${ABSL_BUILD_DLL})
    target_compile_definitions(${_NAME}
      PUBLIC
        ${ABSL_CC_TEST_DEFINES}
        ABSL_CONSUME_DLL
        GTEST_LINKED_AS_SHARED_LIBRARY=1
    )

    # Replace dependencies on targets inside the DLL with abseil_dll itself.
    absl_internal_dll_targets(
      DEPS ${ABSL_CC_TEST_DEPS}
      OUTPUT ABSL_CC_TEST_DEPS
    )
  else()
    target_compile_definitions(${_NAME}
      PUBLIC
        ${ABSL_CC_TEST_DEFINES}
    )
  endif()
  target_compile_options(${_NAME}
    PRIVATE ${ABSL_CC_TEST_COPTS}
  )

  target_link_libraries(${_NAME}
    PUBLIC ${ABSL_CC_TEST_DEPS}
    PRIVATE ${ABSL_CC_TEST_LINKOPTS}
  )
  # Add all Abseil targets to a folder in the IDE for organization.
  set_property(TARGET ${_NAME} PROPERTY FOLDER ${ABSL_IDE_FOLDER}/test)

  set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${ABSL_CXX_STANDARD})
  set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)

  add_test(NAME ${_NAME} COMMAND ${_NAME})
endfunction()

使用如下

absl_cc_test(
  NAME
    container_test
  SRCS
    "container_test.cc"
  COPTS
    ${ABSL_TEST_COPTS}
  DEPS
    absl::algorithm_container
    absl::base
    absl::core_headers
    absl::memory
    absl::span
    gmock_main
)

后面还是太复杂了,按照gn文件缺少的补充空项目,但不修改gn文件的原则,成功构建项目,github上面原有的文件是从chromium项目中剥离出来的,缺少的项目可以在chromium中找到。timestamp返回错误1,可以main全部注释直接return 0,

import("//webrtc.gni")

config("gmock_config"){

}
config("gtest_config"){

}
rtc_source_set("gmock_main"){
    
}
rtc_source_set("gtest_main"){
    
}
rtc_source_set("gtest"){
    
}
rtc_source_set("gmock"){
    
}

在这里插入图片描述

gn gen out --ide=“vs2019” 生成vs项目,方便查找项目缺失的模块
gn args out 配置arg.gn文件,项目在window中配置set DEPOT_TOOLS_WIN_TOOLCHAIN=0,ninja -C out -k3000编译

host_cpu = "x64"
host_os = "win"
is_clang = false
visual_studio_version = 2019

在这里插入图片描述
不过还是有很多编译错误,只能在vs中慢慢修改,vs项目配置和ninja文件关联,修改vs配置还要修改对应项目的ninja文件,缺少的变量可以注释
在这里插入图片描述

webrtc

http://webrtc.p2hp.com/
相关项目
[git clone https://github.com/webrtc/FirebaseRTC](git clone https://github.com/webrtc/FirebaseRTC)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪力左手

囧rz

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值