《Linux编程手册》数据报客户端例子

关于recvfrom中是否需要指定接收地址,如果有兴趣定位发送者,可以使用recvfrom来得到数据发送者的源地址。


//        numBytes = recvfrom(sfd, resp,BUF_SIZE, 0, NULL, NULL);

        numBytes = recvfrom(sfd, resp,BUF_SIZE, 0,    (struct sockaddr*)&svaddr,&len);


#include <stdio.h>
#include "ud_ucase.h"
int main(int argc, char *argv[])
{
    struct sockaddr_un svaddr, claddr;
    int sfd, j;
    ssize_t msgLen;
    ssize_t numBytes;
    char resp[BUF_SIZE];
    socklen_t len;

    if(argc < 2 || strcmp(argv[1], "--help") == 0)
      usageErr("%s msg...\n", argv[0]);

    sfd = socket(AF_UNIX, SOCK_DGRAM, 0);//进程间数据报socket
    if(sfd == -1)
      errExit("socket");

    memset(&claddr, 0, sizeof(struct sockaddr_un));
    claddr.sun_family = AF_UNIX;
    snprintf(claddr.sun_path, sizeof(claddr.sun_path),
                "/tmp/ud_ucase_cl.%ld", (long)getpid());//本地socket和文件路径相关联,网络socket是和网络地址绑定

    if(bind(sfd, (struct sockaddr *)&claddr, 
                    sizeof(struct sockaddr_un)) == -1)
      errExit("bind");

    memset(&svaddr, 0, sizeof(struct sockaddr_un));
    svaddr.sun_family = AF_UNIX;
    strncpy(svaddr.sun_path, SV_SOCK_PATH, 
                sizeof(svaddr.sun_path)-1);

    for(j=1; j< argc; j++)
    {
        len = sizeof(struct sockaddr_un);
        msgLen = strlen(argv[j]);
        if(sendto(sfd, argv[j], msgLen, 0, 
                        (struct sockaddr *)&svaddr,
                        sizeof(struct sockaddr_un)) != msgLen)
          fatal("sendto");

//        numBytes = recvfrom(sfd, resp,BUF_SIZE, 0, NULL, NULL);
        numBytes = recvfrom(sfd, resp,BUF_SIZE, 0,    (struct sockaddr*)&svaddr,&len);

        if(numBytes == -1)
          errExit("recvfrom");
        printf("Response %d: %.*s\n",j, (int)numBytes, resp);
    }

    remove(claddr.sun_path);
    exit(EXIT_SUCCESS);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值