xxxxxxyyttz

receiver.c

#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define HELLO_PORT  12345
#define HELLO_GROUP "225.0.0.37"
#define SERVER_IP "192.168.1.128"
#define LOCAL_IP "192.168.1.129"
#define MSGBUFSIZE 256
int main(int argc, char *argv[])
{
    struct sockaddr_in addr;
    int fd, nbytes,addrlen;
    struct ip_mreq mreq;
    char msgbuf[MSGBUFSIZE];
    u_int yes=1; /*** MODIFICATION TO ORIGINAL */
    /* create what looks like an ordinary UDP socket */
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) 
    {
        perror("socket");
        exit(1);
    }
    /**** MODIFICATION TO ORIGINAL */
    /* allow multiple sockets to use the same PORT number */
    if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) 
    {
        perror("Reusing ADDR failed");
        goto exit;
    }
    /*** END OF MODIFICATION TO ORIGINAL */
    /* set up destination address */
    memset(&addr,0,sizeof(addr));
    addr.sin_family=AF_INET;
    addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */
    addr.sin_port=htons(HELLO_PORT);

    /* bind to receive address */
    if (bind(fd,(struct sockaddr *)&addr,sizeof(addr)) < 0)
    {
        perror("bind");
        goto exit;
    }

    /* use setsockopt() to request that the kernel join a multicast group */
    mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);
    mreq.imr_interface.s_addr=inet_addr(LOCAL_IP);
    if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) 
    {
        perror("setsockopt");
        goto exit;
    }
    /* now just enter a read-print loop */
    while (1) 
    {
        //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
        addrlen=sizeof(addr);
        if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (socklen_t *)&addrlen)) < 0) 
        {
            perror("recvfrom");
            goto exit;
        }
        puts(msgbuf);
    }
exit:
    close(fd);
    return 0;
}

sender.c

#include <stdio.h>
#include <sys/socket.h> //AF_INET, SOCK_DGRAM
#include <netinet/in.h> //sockaddr_in, ip_mreq
#include <stdlib.h> //exit
#include <string.h> //memset, strlen
#define HELLO_PORT 12345
#define HELLO_GROUP "225.0.0.37"
int main(int argc, char *argv[])
{
    struct sockaddr_in addr;
    struct in_addr localIntf;
    int fd, ttl;
    char *message="Hello, World!";

    /* create what looks like an ordinary UDP socket */
    if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)
    {
        perror("socket");
        exit(1);
    }
    /* set up destination address */
    memset(&addr,0,sizeof(addr));
    addr.sin_family=AF_INET;
    addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);
    addr.sin_port=htons(HELLO_PORT);

    localIntf.s_addr = inet_addr("192.168.1.128");
    if(setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localIntf, sizeof(localIntf)) < 0) {
        perror("set multicast interface");
        goto exit;
    }
    printf("set multicast interface OK.\n");

    ttl = 5;
    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) < 0) {
        perror("set multicast ttl");
        goto exit;
    }

    /* now just sendto() our destination! */
    while (1)
    {
        if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)
        {
            perror("sendto");
            goto exit;
        }
        printf("sent a message to multicast group.\n");
        sleep(1);
    }
exit:
    close(fd);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值