📜  Unix套接字教程(1)

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

Unix套接字教程

Unix套接字是Unix系统中的进程间通信机制之一,它允许不同进程在同一台计算机上通过网络进行通信。本教程将介绍Unix套接字概念、套接字类型、创建、绑定和通信等方面的内容。

Unix套接字概念

Unix套接字是一种网络通信协议,它提供了进程间通信的方法。它是一种全双工的通信机制,可以同时进行读取和写入操作。

Unix套接字是通过套接字标识符(Socket)进行访问的,它是一个整型数值。套接字总是与一个网络协议相关联,如TCP、UDP、ICMP等。

Unix套接字类型

Unix套接字有不同的类型,每种类型提供了不同的特性。

流套接字

流套接字提供面向连接的可靠通信,数据在发出时会保证有序且不会丢失。

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
数据报套接字

数据报套接字提供无连接的不可靠通信,数据在发送时可能无序或者丢失。

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
原始套接字

原始套接字允许进程直接访问底层网络协议,发送和接收的都是未经处理的网络报文。

int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
其他类型

还有其他类型的套接字,如信号套接字、存储套接字等。

Unix套接字创建

Unix套接字通过socket函数进行创建,一般需要指定套接字类型、协议族(AF_INET、AF_UNIX等)、协议类型(TCP、UDP、ICMP等)。

#include <sys/socket.h>

int socket(int domain, int type, int protocol);
Unix套接字绑定

创建套接字后,还需要将套接字与特定地址进行绑定。通常情况下,服务器需要在一个固定的地址和端口上监听客户端连接。而客户端则可以选择指定一个随机的端口,也可以让系统自动分配一个端口。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

int ret = bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
Unix套接字通信

Unix套接字提供了send、recv、sendto、recvfrom等函数进行通信,可以通过TCP或UDP进行数据传输。另外,还有select、poll等函数可以用于多路复用。下面是一个简单的例子:

#include <sys/socket.h>
#include <unistd.h>

char buffer[1024];
ssize_t n;

// 接收数据
n = recv(sockfd, buffer, sizeof(buffer), 0);
if (n < 0) {
    // 错误处理
}
else if (n == 0) {
    // 对端关闭连接
}
else {
    // 处理接收到的数据
}

// 发送数据
n = send(sockfd, buffer, sizeof(buffer), 0);
if (n == -1) {
    // 错误处理
}

需要注意的是,Unix套接字通信是阻塞的,即进程在进行输入/输出操作时可能会被阻塞,直到操作完成为止。因此,在编写程序时需要防止阻塞导致程序无响应的情况。