linux 网络编程
linux网络开发
网络发展历史和分层
网络采用分层的思想:
- 每一层实现不同的功能,对上层的数据做透明传输
- 每一层向上层提供服务,同时适用下层提供的服务
各层典型的协议:
网络接口与物理层
MAC地址:48位全球唯一,网络设备的身份标识
ARP/RARP
ARP:IP地址----->MAC地址
RARP:MAC地址---》IP地址
PPP协议:拨号协议(GPRS/3G/4G)
网络层:
IP
ICMP
IGMP
传输层:
TCP
UDP
TCP/UDP特点
网络编程的预备知识
Socket 简介
socket
- 是一种应用的编程接口
- 是一种特殊的文件描述符 (对它执行IO的操作函数,比如,read(),write(),close()等操作函数)
- 并不仅限于TCP/IP协议
- 面向连接
- 无连接
socket类型
流式套接字(SOCK_STREAM) 唯一对应着TCP
- 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM) 唯一对应着UDP
- 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW) (对应着多个协议,发送穿透了传输层)
- 可以对较低层次协议如IP、ICMP直接访问。
IP地址
- IP地址分为 IPV4和IPV6
- IPV4:采用32位的整数来表示
- IPV6:采用128位的整数来表示
IPV4:
点分形式:192.168.7.2
32位整数
特殊IP地址:
局域网IP:192.xxx.xxx.xxx 10.xxx.xxx.xxx
广播IP:xxx.xxx.xxx.255 255.255.255.255(全网广播)
组播IP:224.xxx.xxx.xxx~239.xxx.xxx.xxx
端口号:
16位的数字(1-65535)
- 众所周知端口:1~1023(FTP:21,ssh:22,HTTP:80,HTTPS:469)
- 保留端口:1024-5000(不建议使用)
- 可以使用的端口:5001~65535
TCP端口与UDP端口相互独立
网络里面的通信是由 IP地址+端口号 来决定的
字节序
字节序是指不同的CPU访问内存中的多字节数据时候,存在大小端问题。
如果CPU访问的是字符串,则不存在大小端问题。
大小端:
小端:低对低,低端数据对应低端
大端:低对高,低端内存对应高端数据
一般来说:
X86/ARM:小端
powerpc/mips,ARM作为路由器时,大端模式
网络传输的时候采用大端模式
本地字节序、网络字节序
字节序转换函数
主机字节序到网络字节序
- u_long htonl (u_long hostlong);
- u_short htons (u_short short);
网络字节序到主机字节序
- u_long ntohl (u_long hostlong);
- u_short ntohs (u_short short);
IP地址转换函数
in_addr_t inet_addr(const char *cp);
cp:点分形式的IP地址,结果是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)
特点:
- 仅适应与IPV4
- 当出错时,返回-1
- 此函数不能用于处理255.255.255.255的转换问题
#include <arpa/inet.h>
int inet_pton(int af,const char *src,void *dst);
特点: 1.适应与IPV4和IPV6
2.能正确处理255.255.255.255的转换问题
参数:
- af:地址协议族(AF_INET或AF_INET6)
- src:是一个指针(填写点分形式的IP地址[主要指IPV4])
- dst:转换的结果给到dst
TCP网络编程API
- socket()函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数:
-
domain:
AF_INET IPv4 Internet protocols
AF_INET6 IPv6 Internet protocols -
type:
SOCK_STREAM:流式嵌套接字 唯一对应TCP
SOCK_DGRAM:数据报套接字 唯一对应着UDP
SOCK_RAW:原始套接字 -
protocol 一般填0;
-
bind()函数
-
listen()函数
-
accept()函数,阻塞等待客户端连接请求
-
客户端连接函数 connect()
connect函数和bind()函数写法类次