目录
1. 预备介绍
2.网络字节序
3.udp网络程序
4.地址转换函数
5.udp网络编程
1.预备介绍
1.1源IP地址和目标IP地址
举个例子:
从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海.
1.2 端口号
作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理;
(1) 端口号是2字节16位数据;
(2) 端口号+IP地址就可以标识特定的某一台主机和某一个进程来处理;
(3) 一个端口号只能标识一个进程;
小tips:
端口号和进程ID有什么联系?
一个进程可以有多个端口号, 但是一个端口号只能标识一个进程.
源端口号和目标端口号
源端口号是指发送数据的应用程序在本地计算机上使用的端口号,而目的端口号是指接收数据的应用程序在远程计算机上使用的端口号。
举个栗子: 送快递的这个快递是谁发的,就是源端口号, 发送给谁就是目标端口号.
1.3 TCP协议和udp协议特点
TCP特点: 传输层协议 有连接 可靠传输 面向字节流
UDP特点: 传输层协议 无连接 不可靠传输 面向数据报
2.网路字节序
网络数据流和内存地址一样也是分大小端的, 网络字节序就是用来定义网络数据流的地址.
(1)发送端主机通常将缓冲区的数据由低到高的顺序发出;
(2)接受端主机也将数据由低到高的顺序进行保存到缓冲区;
(3)所以先发出的数据是低地址, 后发出的是高地址.
(4)无论主机是大端还是小端机, 都是按照TCP/IP协议是大端字节序(低位是高地址);
2.1 认识一些接口用于主机字节序和网络字节序的交换:
(1)socket: 创建一个套接字.(文件描述符)
参数1.domain:地址族; 就是IP地址类型, 常用有AF_INET和AF_INET6.
2.type:套接字的类型, 有SOCK_STREAM(流式套接字) 和 SOCK_DGRAM(数据报套接字);
3.protocol: 传输协议;
(2) bind: 绑定端口号.
(3) listen: 监听端口号;
(4)accept接受请求:
(5) connect建立连接:
sockaddr结构体:网络编程接口
sockaddr:保存多种类型的IP的地址和端口号.
sockaddr_in: 用来专门保存IPv4的地址
3.udp网络程序
这里专门后面写一篇博客详细讲解! 大家可以蹲一波.谢谢!
4.地址转换函数
sockaddr结构体里面的一个字段:
sin_addr: 是表示32位的IP地址, 我们通常的读取地址字符串的点分十进制;
字符串转in_addr的函数:
htonl和htons是用来主机序转为网络序;
ntohl和ntohs是用来网络序转为主机序;
in_addr转字符串的函数:
inet_ntoa函数: 将返回结果放到了静态区, 第二次调用会覆盖之前的数据, 可能造成线程不安全的问题, 最好使用inet_ntop, 将数据存放在缓存区.
5.TCP网络编程
这个和udp编程放到一篇博客里面具体来讲.
6.sock API
(1) sock:打开网络通讯接口;成功就会返回一个文件描述符;
错误就会返回-1;
int sock(int domain, int type, int protocol)
(2) bind: 用来绑定特定的IP地址和端口号用来向服务器发起连接;
成功返回0, 失败返回-1.
将sockfd和addr进行绑定, 用于网络监听文件描述符;
Add:
对于addr需要自己进行手动修改, bzero进行清零; 设置sin_family , sin_addr.s_addr ,
sin_port.
int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
(3) listen: 网络监听
backlog是运行客户端等待连接的个数;
listen()成功返回0,失败返回-1;
int listen(int sockfd, int backlog)
(4) accept:
三次握手成功之后, 调用accept接受连接;
如果还没有客户端连接的请求就会阻塞等待直到客户端连接;
addr参数是用来传出客户端的IP和端口号; 如果为NULL就是不关系客户端的地址;
addrlen参数就是用来缓冲区的长度避免溢出, 传出的是sockaddr的实际长度.
int accept(int sockfd, const struct sockaddr* addr, struct socklen_t* addrlen)
(5) connect:连接服务器;
与bind的区别: connect连接的是别人的地址, bind的是自己的地址.
成功返回0, 失败返回-1.
int connect(int sockfd, const struct sockaddr* addr, socklen_t addrlen)