unix domain socket udp 例子

15 篇文章 2 订阅

网上的例子不是很全,记录一下C语言实现的uds udp通信。

client和server分别创建两个socket,一个用来发送,一个用来接收

//server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
int sock_r;
int sock_s;
int my_create_sock(char *path)
{
    int sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    struct sockaddr_un addr;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, path);

    if (!access(path, F_OK)) {
        remove(path);
    }
    if (sock < 0) {
        printf("create %s sock fail! %d\n", path, errno);
        return -1;
    }
    if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        printf("bind %s sock fail! %d\n", path, errno);
        return -1;
    }
    return sock;
}

int my_sock_init(void)
{
    sock_r = my_create_sock("eth_s_recv.sock");
    sock_s = my_create_sock("eth_s_send.sock");

    if ((sock_r < 0) || (sock_s < 0)) {
        printf("sock create fail\n");
        return -1;
    }

    return 0;
}
int my_uds_send_msg(int sock, char *path, char *data, int len)
{
    struct sockaddr_un serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, path);
    if (sendto(sock, data, len, 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {
        printf("send to %s fail! %d\n", path, errno);
        return -1;
    }
    printf("send to %s success!\n", path);
    return 0;
}
int my_uds_recv_msg(int sock, char *data)
{
    struct sockaddr_un serveraddr;
    int size, len;
    size = recvfrom(sock, data, 1024, 0, (struct sockaddr*)&serveraddr, &len);       
    if (size < 0) {
        printf("recv fail! %d\n", errno);
        return -1;
    }
    return size;
}
void my_sock_release(void)
{
    if (close(sock_s) < 0) {
        printf("close sock fail! %d\n", sock_s);
    }
    if (close(sock_r) < 0) {
        printf("close sock fail! %d\n", sock_r);
    }
}
int main(void)
{
    char data[1024];
    if (my_sock_init()) {
        return -1;
    }
    if (my_uds_recv_msg(sock_r, data) > 0) {
        printf("%s\n", data);
    }
    while (!my_uds_send_msg(sock_s, "eth_c_recv.sock", "Hello world: MY", 15)) {     
        sleep(1);
    }
    my_sock_release();
    return 0;
}
//client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
int sock_r;
int sock_s;
int my_create_sock(char *path)
{
    int sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    struct sockaddr_un addr;
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strcpy(addr.sun_path, path);

    if (!access(path, F_OK)) {
        remove(path);
    }
    if (sock < 0) {
        printf("create %s sock fail! %d\n", path, errno);
        return -1;
    }
    if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        printf("bind %s sock fail! %d\n", path, errno);
        return -1;
    }
    return sock;
}

int my_sock_init(void)
{
    sock_r = my_create_sock("eth_c_recv.sock");
    sock_s = my_create_sock("eth_c_send.sock");

    if ((sock_r < 0) || (sock_s < 0)) {
        printf("sock create fail\n");
        return -1;
    }

    return 0;
}
int my_uds_send_msg(int sock, char *path, char *data, int len)
{
    struct sockaddr_un serveraddr;
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, path);
    if (sendto(sock, data, len, 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {
        printf("send to %s fail! %d\n", path, errno);
        return -1;
    }
    printf("send to %s success!\n", path);
    return 0;
}
int my_uds_recv_msg(int sock, char *data)
{
    struct sockaddr_un serveraddr;
    int size, len;
    size = recvfrom(sock, data, 1024, 0, (struct sockaddr*)&serveraddr, &len);       
    if (size < 0) {
        printf("recv fail! %d\n", errno);
        return -1;
    }
    return size;
}
void my_sock_release(void)
{
    if (close(sock_s) < 0) {
        printf("close sock fail! %d\n", sock_s);
    }
    if (close(sock_r) < 0) {
        printf("close sock fail! %d\n", sock_r);
    }
}
int main(void)
{
    char data[1024];
    if (my_sock_init()) {
        return -1;
    }
    if (my_uds_send_msg(sock_s, "eth_s_recv.sock", "Hello world", 11)) {
        return -1;
    }
    while (my_uds_recv_msg(sock_r, data) > 0) {
        printf("%s\n", data);
    }
    my_sock_release();
    return 0;
}

编译后执行效果如下

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值