1. 网络传输数据时须要考虑字节序问题。即大端小端问题:
x86系列CPU都是little-endian的字节序.
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与详细的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时可以被正确解释。
网络字节顺序採用big endian排序方式。
为了进行转换 bsd socket提供了转换的函数 有以下四个
htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序
在使用little endian的系统中 这些函数会把字节序进行转换。
在发送数据之前将主机序转换为网络序,在接收到数据后须要将网络序转换为主机序。
2. 设置路由器虚拟server实现外网向内网发送数据包
外网向内网发送的数据包目的IP为路由器IP,路由器依据数据包的目的port将数据包转发给内网主机。
3.内网和外网通讯
内网先向外网独立IP发送一个TCP报文,路由器会在此时自己主动建立一个NAT映射,将内网IP和port号同WAN口IP和port号相应并缓存。缓存更新时间貌似是50s。其后外网独立IP向内网发报文时,目的IP採用内网所在的路由器WAN口IP,port还是路由器的映射port,就能够通信了。
UDP试了。不行,不知道为啥。