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!";
- if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)
- {
- perror("socket");
- exit(1);
- }
- 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);
- 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;
- if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)
- {
- perror("socket");
- exit(1);
- }
- if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)
- {
- perror("Reusing ADDR failed");
- exit(1);
- }
- memset(&addr,0,sizeof(addr));
- addr.sin_family=AF_INET;
- addr.sin_addr.s_addr=htonl(INADDR_ANY);
- addr.sin_port=htons(HELLO_PORT);
- if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)
- {
- perror("bind");
- exit(1);
- }
- 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);
- }
- 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/
Multicast Programming Sample
The following sample code illustrates how to include multicast functionality to a Windows Sockets application using socket options.
int /* OUT: whatever setsockopt() returns */
join_source_group(int sd, u_int32 grpaddr,
u_int32 srcaddr, u_int32 iaddr)
{
struct ip_mreq_source imr;
imr.imr_multiaddr.s_addr = grpaddr;
imr.imr_sourceaddr.s_addr = srcaddr;
imr.imr_interface.s_addr = iaddr;
return setsockopt(sd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, &imr, sizeof(imr));
}
int
leave_source_group(int sd, u_int32 grpaddr,
u_int32 srcaddr, u_int32 iaddr)
{
struct ip_mreq_source imr;
imr.imr_multiaddr.s_addr = grpaddr;
imr.imr_sourceaddr.s_addr = srcaddr;
imr.imr_interface.s_addr = iaddr;
return setsockopt(sd, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, &imr, sizeof(imr));
}
Send comments about this topic to Microsoft