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)