📜  Unix套接字-核心功能(1)

📅  最后修改于: 2023-12-03 15:35:31.615000             🧑  作者: Mango

Unix套接字-核心功能

Unix套接字(socket)是在Unix系统中非常常用的通信机制,它可以用于同一台机器上的进程间通信,也可以进行跨网络的进程间通信。在网络编程中,Unix套接字通常是最常用的网络通信方式。

套接字类型

在Unix套接字中,有两种主要的类型:流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。

流式套接字

流式套接字提供了一种面向连接的、可靠的、双向字节流的通信方式。它保证了发送的数据不会发生错误或丢失,而且数据按照发送的顺序到达接收端。

流式套接字通常用于传输数据量较大且要求可靠性的任务,例如HTTP协议、FTP协议等。

数据报套接字

数据报套接字提供了一种无连接的通信方式,可以发送和接收固定长度的数据包。由于是无连接的,所以并不能保证数据的可靠性和传输顺序,并且在发送数据时不需要进行建立连接的操作。

数据报套接字通常用于传输数据量小且要求实时性的任务,例如DNS协议、SNMP协议等。

常用系统调用

在Unix套接字中,常用的系统调用有以下几个:

socket

用于创建套接字:

int socket(int domain, int type, int protocol);

其中,domain参数指定地址族(例如IPv4或IPv6),type参数指定套接字类型(例如流式或数据报套接字),protocol参数通常传入0或者特定的协议号。该函数返回套接字描述符(socket descriptor)。

bind

用于将套接字绑定到一个特定的地址和端口:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

其中,sockfd参数是socket函数返回的套接字描述符,addr参数指定要绑定的地址和端口,addrlen参数指明addr的长度。该函数返回0表示成功,-1表示失败。

listen

用于将一个套接字设置为被动套接字,等待客户端连接:

int listen(int sockfd, int backlog);

其中,sockfd参数是socket函数返回的套接字描述符,backlog参数指定可以排队的连接请求的最大数量。该函数返回0表示成功,-1表示失败。

accept

用于接收客户端的连接请求:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

其中,sockfd参数是socket函数返回的套接字描述符,addr参数指向一个结构体来存储客户端的地址和端口号,addrlen参数是addr结构体的长度。该函数返回一个新的套接字描述符,用于和客户端进行通信,如果失败则返回-1。

connect

用于和服务器建立连接:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

其中,sockfd参数是socket函数返回的套接字描述符,addr参数指向服务器的地址和端口号,addrlen参数是addr结构体的长度。该函数返回0表示成功,-1表示失败。

send和recv

用于发送和接收数据:

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

其中,sockfd参数是socket函数返回的套接字描述符,buf参数指向要发送/接收的数据缓冲区,len参数指定要发送/接收的数据长度,flags参数通常设置为0。两个函数的返回值都是成功发送/接收的数据长度,-1表示失败。

close

用于关闭套接字:

int close(int sockfd);

其中,sockfd参数是socket函数返回的套接字描述符。该函数返回0表示成功,-1表示失败。

总结

Unix套接字是Unix系统中非常常用的通信机制,提供了流式和数据报两种套接字类型。程序员需要熟练掌握套接字的各种系统调用,以便编写高效可靠的网络应用程序。