前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >p2p协议(webrtc编译)

p2p协议(webrtc编译)

作者头像
sofu456
发布2020-11-03 14:49:02
2.4K0
发布2020-11-03 14:49:02
举报
文章被收录于专栏:sofu456sofu456

p2p优势

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

跨网段编程

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

路由跟踪

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

代码语言:javascript
复制
//定义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

地址:https://gitee.com/hezikj/webrtc 使用ninja(build.ninja配置文件)、gn(.gn配置文件)编译

  • gn gen out/Debug
  • ninja -C out/Debug

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

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

代码语言:javascript
复制
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()

使用如下

代码语言:javascript
复制
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中找到。

代码语言:javascript
复制
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项目,方便查找项目缺失的模块

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • p2p优势
  • 跨网段编程
  • 路由跟踪
  • webrtc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档