什么是网络编程
网络编程简单来说就是编程使得计算机之间交互数据。
硬件部分已经接入了互联网中,我们需要考虑的是软件部分。
软件部分有OS提供的套接字。
套接字
套接字用于网络数据传输,这个名字看上去很奇特。socket也是“插座”的意思,意味着可以进行连接,就像用电设备连入电网一样。
套接字的构建
首先以TCP套接字为例,我们把它比为电话机
1.调用socket
首先需要安装电话机,对socket进行创建
#include <sys/socket.h>
int socket(int domain,int type,int protocol);
2.调用bind函数
有了电话机,我们需要分配电话号码,也就是给socket分配IP地址和端口号。
#include <sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);
3.调用listen函数
下一步需要连接电话线,转为接听状态
#include <sys/socket.h>
int listen(int sockfd,int backlog);
4.调用accept函数
电话来了当然是要接听的,这样才能接受对方的连接请求
#include <sys/socket.h>
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)
以上就是套接字编程的基本流程了。
服务端和客户端
如何区分服务端还是客户端?
简单来说,服务端就是在后方默默服务的部分,主要用于接收请求,而客户端是要和用户进行交互的部分,主要是发送请求。
客户端在请求连接的时候,也会创建客户端套接字。
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *servaddr,socklen_t addrlen);
客户端只需要:
1.调用socket函数
2.调用connect函数发送
套接字协议
前面说完了创建sokcet,接下来细说其参数
int socket(int domain,int type,int protocol);
1.domain:套接字使用的协议族
2.type:套接字数据传输类型
3.protocol:计算机之间通信的协议
协议族
对于socket的协议族来说,PF_INET代表IPV4协议族,PF_INET6代表IPV6协议族。
第三个参数才是socket实际使用的协议。
套接字类型
1.面向连接的套接字
SOCK_STREAM,创建面向连接的套接字。(TCP)
数据会按顺序传递,并且不会消失。
并且有buffer,可以保存数据,在读取时可以一次性全部读出,也可以分几次读取。
如果明白TCP的原理,那么可以知道在缓冲区满时会停止传输,并且有重传机制。
2.面向消息的套接字
SOCK_DGRAM,创建面向消息的套接字(UDP)
速度更重要, 不按顺序,并且有可能会丢失数据。
而且数据传输有大小限制,接收数据次数与传输次数也相同。
基于UDP,所以遵循UDP的原理
协议选择
第三个参数负责选择协议。当协议族和类型确定之后,大部分情况都不需要第三个参数可为0。
除了一种情况,同一个协议族(比如IPV4)有多个数据传输方式相同的协议。
对于PF_INET+SOCK_STREAM的组合来说,只有IPPROTO_TCP一个协议。
对于PF_INET+SOCK_DGRAM的组合来说,只有IPPROTO_UDP一个协议。
地址族与数据序列
创建socket的下一步是调用bind函数,来分配IP地址和端口号。
IP地址分类IPV4和IPV6,IPV4又根据网络段和主机段分为ABCDE五类。(详解见计算机网络部分)
根据IP地址可以找到目标主机,而想要传输到对应的应用程序,就需要端口号了