📜  Unix套接字-结构(1)

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

Unix套接字-结构

Unix套接字是在进程间通信时使用的一种方法,包括基于文件的套接字和网络套接字。

结构

Unix套接字由两部分组成:地址和数据。

地址

Unix套接字地址通常包含以下信息:

  • 协议: TCP、UDP或本地协议(AF_UNIX)
  • IP地址: 对于IPv4套接字,这是一个32位整数。对于IPv6套接字,这是一个128位整数。
  • 端口号: 16位整数,区分不同的套接字进程。

在Unix系统中,套接字地址通常使用sockaddr结构表示:

struct sockaddr {
   unsigned short sa_family; // 地址族,AF_INET、AF_INET6或AF_UNIX
   char           sa_data[14]; // 地址数据
};
数据

套接字数据是指要在进程之间传输的数据。它可以是字节串,也可以是一个协议数据单元(PDU)。

示例

下面是一个使用Unix套接字的C程序示例:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT_NUMBER     5000
#define BUFFER_LENGTH   512

int main(int argc, char** argv) {
    int sockfd;
    ssize_t n;
    socklen_t addr_len;
    char buffer[BUFFER_LENGTH];
    struct sockaddr_in addr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd == -1) {
        fprintf(stderr, "Error creating socket: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT_NUMBER);
    if (inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) <= 0) {
        fprintf(stderr, "Error converting address: %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    while (1) {
        printf("Type a message: ");
        fgets(buffer, BUFFER_LENGTH - 1, stdin);
        buffer[strlen(buffer) - 1] = '\0';

        addr_len = sizeof(struct sockaddr);
        n = sendto(sockfd, buffer, strlen(buffer), 0,
                   (const struct sockaddr*) &addr, addr_len);
        if (n == -1) {
            fprintf(stderr, "Error sending message: %s\n", strerror(errno));
            exit(EXIT_FAILURE);
        }

        if (strcmp(buffer, "exit") == 0) {
            break;
        }
    }

    close(sockfd);
    exit(EXIT_SUCCESS);
}

这个示例程序使用了UDP套接字,将任何从标准输入中输入的消息发送到127.0.0.1:5000地址上。如果输入exit,程序将退出。