多个客户端连接服务端,通过单一的服务端转发数据,服务端压力太大,所以使用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 unreachable1 = host unreachable2 = protocol unreachable3 = port unreachable4 = fragmentation needed and DF set5 = source route failedip协议中的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网页即时通信(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/Debugninja [build] -C out/Debuggithub上面找到的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文件,缺少的变量可以注释