📅  最后修改于: 2023-12-03 15:05:45.941000             🧑  作者: Mango
在Unix/Linux系统中,套接字是一种在进程之间传输数据的机制,类似于管道。Unix套接字是一种双向通讯的方式,允许两个进程在同一个主机上或不同主机之间通讯。
网络主机名则是互联网中的网络标识符,用于标识网络中的计算机节点。计算机节点可以通过网络主机名进行唯一标识,进而进行通讯。
Unix套接字通过socket系统调用进行创建,在创建时需要指定协议族、套接字类型和地址族等参数。常用的协议族有AF_INET和AF_UNIX,其中AF_UNIX用于本地通讯,而AF_INET则用于网络通讯。
创建套接字后,可以通过bind系统调用将套接字与地址绑定,进而使其能够被其他进程访问。地址族为AF_INET时,地址格式为IPv4地址和端口号的组合;地址族为AF_UNIX时,地址格式为文件路径。
通讯时,套接字可以通过send和recv等系统调用进行数据传输。在进行网络通讯时,需要使用网络主机名进行标识,以便指定通讯的目标节点。网络主机名通常通过DNS进行解析,得到主机的IP地址后再与端口号结合形成完整的地址。
以下是一个简单的Unix套接字程序示例,用于在本地进行进程间通讯:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#define SOCKET_PATH "/tmp/demo.sock"
int main() {
// 创建套接字
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 绑定地址
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(sockfd, 5) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
// 等待连接
int clientfd = accept(sockfd, NULL, NULL);
if (clientfd == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
// 接收数据
char buffer[256];
memset(buffer, 0, sizeof(buffer));
if (recv(clientfd, buffer, sizeof(buffer), 0) == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
// 打印数据
printf("Received: %s\n", buffer);
// 关闭套接字
close(clientfd);
close(sockfd);
return 0;
}
Unix套接字和网络主机名是Unix系统中重要的通讯机制和网络标识符。程序员需要熟练掌握其使用方法,才能开发出高效可靠的网络应用程序。