Socket基础以及相关应用函数
什么是socket
socket,也就是我们所谓的套接字,就像插座一样。
IP地址可以在网络环境中唯一的标识一台主机
端口号:在主机当中唯一标识一个进程。
因此,IP地址+端口号,就可以在网络环境中唯一标识一个进程,而在网络环境中被唯一标识的这个进程,就是socket。
再说这个套接字,它本质上是Linux操作系统当中文件的一种类型。确切而言,它是一种伪文件,不占用存储。
再说,linux中实际占用存储空间的文件类型有三种:
- 普通文件
- 目录
- 软连接,内部记录所指向文件的文件的路径名。
除此之外,还有四种文件:
- 字符设备
- 块设备
- 管道
- 套接字
说到管道,它有一个读段和一个写端。而对应到管道,我们来分析socket,这个socket也会建立一个文件描述符,而它的特别之处在于,它有两个缓冲区:一个负责读入,一个负责写出。因此,socket是全双工双向通信的。
从上面的通讯原理示意,可知道套接字都是成对出现的。
相关的应用函数
IP地址转换函数
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Sockaddr数据结构:
struct sockaddr {
sa_family_t sa_family; /*address family, AF_xxx */
char sa_data[14]; /*14 bytes of protocol address */
};
Pv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位端口号和32位IP地址,IPv6地址用sockaddr_in6结构体表示,包括16位端口号、128位IP地址和一些控制字段。
socket函数
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain,int type, int protocol);
domain:
-
AF_INET, 这式大多数用来产生socket的协议,使用TCP或者UDP来传输,使用IPv4地址。
-
AF_INET6,类似,使用IPV6协议
-
AF_UNIT,本地协议,使用在Unix或者Linux上,一般式服务器与客户端在同一机器上时候使用
type也就是使用的协议类型:
- 流式协议,默认方式tcp,SOCK_STREAM,这个协议是按照顺序的、可靠的、数据完整的
- 报式协议,默认方式udp,SOCK_DGRAM,这个协议是无连接的,固定长度的传输。
protocal: 传0表示使用默认协议。
bind函数
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd,文件描述符;
addr,构建出IP地址加端口号
addrlen,sizeof(addr)
返回值,成功0,失败为-1,errno
**服务器程序所监听的网络地址和端口号通常是固定不变的,**客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。
因此,bind的作用是将sockfd和addr绑定到仪器,使sockfd这个用于网络通讯的文件描述符监听addr所描述的地址和端口号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8keZSPrU-1578983102870)(image.png)]
listen函数
listen声明sockfd处于监听状态,并指明同时最多能与我建立连接的客户端数量。
Accept函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PgDx6GH-1578983102871)(image.png)]
以下程序,客户端连接服务器端,客户端输入字符串&