sockaddr_un实例--监听与连接UNIX域socket

本文深入探讨了使用sockaddr_un结构体在UNIX域进行socket监听与连接的详细过程,涵盖创建、绑定、监听和接受连接等关键步骤,是理解本地进程间通信(IPC)的有效实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 要点:sockaddr_un
 * 功能:监听UNIX域socket 
 * 成功:返回新生成的套接字文件描述符 
 * 失败:返回-1 
 */
int std_listen_unix(const char *socketfile)
{
    int fd = 0, len = 0, operate_ret = OPERATE_SUCCESS;
    struct sockaddr_un serv;

    if((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
    {
        STD_DEBUG_PRINT("socket failed! %s\n", strerror(errno));
		operate_ret = OPERATE_FAILED;
        goto ret_lable;
    }
	
    unlink(socketfile);	/***********************/

    len = strlen(socketfile);

    if(len > 107)
    {
        DEBUG_PRINT ("socket file len is too long!");
		operate_ret = OPERATE_FAILED;
        goto ret_lable;
    }

    memset (&serv, 0, sizeof(serv));
    serv.sun_family = AF_UNIX;
    strncpy (serv.sun_path, socketfile, len);

    len += offsetof(struct sockaddr_un, sun_path); /**********/

    if(bind(fd, (struct sockaddr *)&serv, len) < 0)
    {
        DEB
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> #define SOCKET_PATH "/tmp/udp_socket" //服务端bind的地址 #define SOCKET_clientPATH "/tmp/udp_socketclient" #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_un server_addr, client_addr; char buffer[BUFFER_SIZE]; // 创建 UDP Unix 套接字 sockfd = socket(AF_UNIX, SOCK_DGRAM, 0); if (sockfd == -1) { perror("socket 创建失败"); exit(EXIT_FAILURE); } // 设置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); // 设置客户端地址 memset(&client_addr, 0, sizeof(client_addr)); client_addr.sun_family = AF_UNIX; strncpy(client_addr.sun_path, SOCKET_clientPATH, sizeof(client_addr.sun_path) - 1); unlink(SOCKET_clientPATH);//确保路径不存在 if (bind(sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr))< 0 ) { perror("bind error"); close(sockfd); } // 客户端循环发送数据 while (1) { // 发送数据 char *message = "Hello, Server!"; if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("sendto 失败"); close(sockfd); exit(EXIT_FAILURE); } printf("客户端发送: %s\n", message); // 接收服务器响应 socklen_t addr_len = sizeof(client_addr); ssize_t recv_len = recvfrom(sockfd, buffer, BUFFER_SIZE, 0,NULL, NULL); if (recv_len == -1) { perror("recvfrom 失败"); close(sockfd); exit(EXIT_FAILURE); } buffer[recv_len] = '\0'; printf("客户端收到: %s\n", buffer); sleep(1); // 模拟间隔 } close(sockfd); return 0; } 解析一下,这样写对吗
最新发布
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值