📜  Unix套接字-网络主机名(1)

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

Unix套接字-网络主机名

简介

在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系统中重要的通讯机制和网络标识符。程序员需要熟练掌握其使用方法,才能开发出高效可靠的网络应用程序。