基本功能

C++ 资源

自带:主机内通信。

1
2
3
4
5
# first, run server to listen
./tcp_server localhost 9999

# then, run client to establish connect
./tcp_client localhost 9999

server 固定公网 IP

阿里云: CentOS 7

server IP: 47.94.157.136

開放端口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld
# ...
# running
# ...

firewall-cmd --zone=public --add-port=9999/tcp --permanent

firewall-cmd --reload
# success

firewall-cmd --list-ports    # check
# 9999/tcp

server:

1
./server1.o 0.0.0.0 9999

client:

1
./client.o 47.94.157.136 9999

come out:

1
2
connect error
: Connection refused

ping 可以連接

端口掃不到

是因为阿里云外面又套了一層牆,而之前 vultr 就不存在这个问题。

不得不感慨,墙国真是从里到外都是墙啊!

端口放行

reboot

if you do not listen 9999 port on server, you will get Connection refused as well.

run on server

1
./server1.o 0.0.0.0 9999

重新扫描,and Connection success.

阿里云在外面建了一个墙,把里面的墙禁掉,看来是为了符合国人的使用习惯啊:图形化界面设置端口。

implement

传输文件

函数说明

IP 地址格式转换

socket 类型

阻塞型:立即返回,更高效。 非阻塞型:轮询方式。

NAT 穿越 and P2P

NAT 不允许外网主机主动访问内网主机,破坏了端到端的网络通信。

P2P 技术却要求通信双方都能主动发起访问。

解决方案: 特殊场景

基于 UDP 打洞。

典型场景

单层 NAT

多层 NAT

选择解决方案

原则:典型,普遍,通用,简单

参考常见解决技术

ALG:适应性不强。

中间件技术:需要网关、内部主机和应用程序都支持UPnP技术。

打洞技术:STUN,对中间服务器轻依赖,不支持对防火墙和对称NAT的穿越;ICE,非对称NAT环境下首选的NAT穿越解决方案。

Relay服务器中转技术:turn,对中间服务器强依赖,当数据量大时,服务器的并发和处理能力成为瓶颈。

选择方案 ICE 可以参考教程选择免费商品类,注册一个账号,在服务器上搭建。

但出于对这个专业的尊重,还是用 ICE 框架实现吧。

测试 NAT 类型

目标:用 ICE 框架实现文件的传输 \ communication

ICE 原理

ICE 实现方案

1
2
3
4
sudo apt install gtk-doc-tools
wget https://libnice.freedesktop.org/releases/libnice-0.1.16.tar.gz
# 解压到合适位置
 ./configure && make && sudo make install

经过

Java

貌似现成的