一:IP地址
1.基本概念:
- IP地址是在IP协议中,用来标识网络中不同主机的地址
- IP协议有两个版本,IPv4和IPv6,对于IPv4,IP地址是一个4字节,32位的整数(能表示2^32个主机);对于IPv6,IP地址是一个16字节,128位的整数。
- 像192.168.0.1这种IP地址的表示方法,叫做点分十进制字符串风格。
注: IP地址可以标识网络上所有主机中的唯一一个主机。
假设我们在电脑上使用qq给好友发送消息,因为qq运行起来就是进程,这个过程仅仅使用IP地址找到目标主机还不行,还得有一个标识来区分给目标主机的哪个进程发消息。
二:端口号(port)
1.基本概念:
- 端口号是一个2字节16位的整数,用来标识特定机器上的唯一一个进程
注:端口号只在网络上有用。
总结:IP地址和端口号统称为套接字,IP地址+端口号就可以标识网络上的唯一一个主机中的唯一一个进程。
三:TCP协议
1.直观认识TCP:
- TCP是传输层的协议,它用来保证数据传输的可靠性和完整性。
- 传输层协议
- 有连接
- 可靠传输
- 面向字节流(放入内存的数据没有明显的格式要求)
2.UDP协议
- 传输层协议
- 无连接
- 不可靠传输
- 面向数据报(单位:数据报)
- 传输速度快
四:网络字节序
像内存中的多字节数据相对与内存地址有大端和小端之分一样,网络数据流同样也存在大端小端之分。网络中发送主机和接收主机都是按照内存地址从低到高的顺序发出(接收)但是由于发送主机和接收主机可能机型(大端机或小端机)不一样,就会造成数据不一致的问题,所以TCP/IP协议规定,网络数据流采用大端字节序。
但是,这样发送主机和接收主机就必须知道自己是大端机还是小端机,也很麻烦,这里就有一套接口(库函数)可以做网络字节序和主机字节序的转换:
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
使用说明:
- h表⽰host,n表⽰network,l表⽰32位⻓整数,s表⽰16位短整数,htonl就是长整数主机到网络。
- 如果主机是⼩端字节序,这些函数将参数做相应的⼤⼩端转换然后返回;
- 如果主机是⼤端字节序,这些 函数不做转换,将参数原封不动地返回
五:socket编程接口:
创建socket文件描述符
int socket(int domain, int type, int protocol);//第一个参数为地址类型,AF_INET(IPv4)或AF_INET6(IPv6);第二个参数表示socket的类型,UDP用SOCK_DGRA;最后一个参数设置为0
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);//第一个参数为socket文件描述符,第二个为设置网络相关信息的结构体;第三个参数为结构体的大小
接收消息:
- ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);;flags置0表示非阻塞式,倒数第二个参数表示输入型参数(将发送消息的主机的信息写入)返回值表示实际上接收消息的大小
发送消息:
- ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);//addr表示要给谁发,即接收者的相关信息
开始监听
- int listen(int s, int backlog); 将sock设置为监听状态,第二个参数为等待队列的长度,通常设置为5-10
接收请求
- int accept(int s, struct sockaddr *addr, socklen_t *addrlen);请求连接,反回真正用来通信的socket文件描述符,因为listen_sock一直处于监听状态,如果有客户端想要建立连接,就会由listen_sock将客户端信息传过来,等到连接成功或失败,它就继续去监听,第二个参数用来返回客户机的信息,最后一个参数为传入传出参数, 传入的是调用者提供,表示缓冲区addr的长度,为了避免缓冲区溢出问题,传出的是客户端地址结构体(struct sockaddr)的实际长度
建立连接
- int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);客户端使用,用来与服务器建立连接,第二个参数为保存服务器相关信息的地址结构体,最后一个参数为结构体大小
将整数类型的ip转化为点分十进制风格的IP地址
- const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//。第一个参数表示地址类型(IPv4或IPv6),第二参数为要转的IP地址,第三个参数表示转到哪(给缓冲区),最后一个表示缓冲区大小。
将点分十进制风格的IP地址转化为整数。
- in_addr_t inet_addr(const char *cp);//