UNIX套接口服务器与客户端程序(DATAGRAM)

网络应用 专栏收录该内容
10 篇文章 1 订阅

UNIX套接口用于本地进程间通信,DATAGRAM类型提供无连接的非可靠传输。

公用头文件sock_comm.h:

#ifndef __SOCK_COMM_H__
#define __SOCK_COMM_H__

#define DGRAM_SOCK_PATH "/tmp/.unix_dgram_sock"

#endif

客户端程序,发送指定字符串到服务端:

#include <ctype.h>
#include <sys/types.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include "sock_comm.h"

int main(int argc, char *argv[])
{
    int sock;
    struct timeval tv_to;
    struct sockaddr_un addr;
    socklen_t addrlen;
    char *path = DGRAM_SOCK_PATH;
    char sbuf[] = "unix dgram socket test";

    sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("Failed create socket\n");
        return -1;
    }

    tv_to.tv_sec = 5;
    tv_to.tv_usec = 0;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv_to, sizeof(tv_to));

    bzero(&addr, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1);
    addrlen = sizeof(addr.sun_family) + strlen(addr.sun_path);

    if (sendto(sock, sbuf, sizeof(sbuf), 0,
            (struct sockaddr *)&addr, addrlen) == -1) {
        perror("sendto failed!");
        goto out;
    }

    close(sock);
    return 0;
out:
    close(sock);
    return -1;
}

服务端程序,打印接收到的内容:

#include <sys/types.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>

#include "sock_comm.h"

int main(int argc, char *argv[])
{
    int buflen = 0;
    int sock = 0;
    char buf[4096];
    int addrlen = 0;
    socklen_t fromlen;
    struct sockaddr_un addr, from;
    char *path = DGRAM_SOCK_PATH;

    sock = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("socket\n");
        return -1;
    }
    unlink(path);

    bzero(&addr, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1);
    addrlen = sizeof(addr.sun_family) + strlen(addr.sun_path);

    if (bind(sock, (struct sockaddr *) &addr, addrlen) < 0) {
        perror("bind failed!");
        goto out;
    }

    for (;;) {
        buflen = recvfrom(sock, buf, sizeof(buf), 0,
                (struct sockaddr *)&from, &fromlen);
        if (buflen < 1) {
            continue;
        }

        fprintf(stdout, "Received message length %d: %s\n", buflen, buf);
    }
out:
    close(sock);
    return -1;
}
对于DTAGRAM类型,服务端不能使用sendto发送数据到客户端。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值