java在linux中接收组播,Linux下发送与接收组播数据(socket编程)

Sender.cpp

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define HELLO_PORT 12345

#define HELLO_GROUP "225.0.0.37"

int main(int argc, char *argv[])

{

struct sockaddr_in addr;

int fd, cnt;

struct ip_mreq mreq;

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);

/* now just sendto() our destination! */

while (1)

{

if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)

{

perror("sendto");

exit(1);

}

sleep(1);

}

return 0;

}

Recver.cpp

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define HELLO_PORT 12345

#define HELLO_GROUP "225.0.0.37"

#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");

exit(1);

}

/*** 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");

exit(1);

}

/* 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=htonl(INADDR_ANY);

if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)

{

perror("setsockopt");

exit(1);

}

/* 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");

exit(1);

}

puts(msgbuf);

}

return 0;

}

Makefile

CC = gcc

CXX = g++

CFLAGS = -Wall -pipe -D_DEBUG -DDEBUG -g -O0

LDFLAGS = -lstdc++

RM = /bin/rm -f

MODULE_INC = -I../curl-7.21.3/include -I../boost_1_45_0 -I./

MODULE_LIB = -L../boost_1_45_0/stage/lib

CFLAGS += $(MODULE_INC)

LDFLAGS += $(MODULE_LIB)

LIBOBJS = Sender.o Recver.o

TARGET = sender recver

all: $(TARGET)

sender: Sender.o

$(CXX) -o $@ $^ $(LDFLAGS)

recver: Recver.o

$(CXX) -o $@ $^ $(LDFLAGS)

clean:

rm -f *.o

rm -f $(TARGET)

# make rule

%.o : %.c

$(CC) $(CFLAGS) -c $^ -o $@

%.o : %.cpp

$(CC) $(CFLAGS) -c $^ -o $@

install:

cp -f $(TARGET) ../bin/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值