Linux下发送与接收组播数据(socket编程)

Sender.cpp

 

[c-sharp]  view plain copy print ?
 
  1. #include     
  2. #include     
  3. #include     
  4. #include     
  5. #include     
  6. #include     
  7. #include     
  8. #include     
  9. #include     
  10. #define HELLO_PORT 12345    
  11. #define HELLO_GROUP "225.0.0.37"    
  12. int main(int argc, char *argv[])    
  13. {    
  14.     struct sockaddr_in addr;    
  15.     int fd, cnt;    
  16.     struct ip_mreq mreq;    
  17.     char *message="Hello, World!";    
  18.         
  19.     if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
  20.     {    
  21.         perror("socket");    
  22.         exit(1);    
  23.     }    
  24.         
  25.     memset(&addr,0,sizeof(addr));    
  26.     addr.sin_family=AF_INET;    
  27.     addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);    
  28.     addr.sin_port=htons(HELLO_PORT);    
  29.         
  30.     while (1)    
  31.     {    
  32.         if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)     
  33.         {    
  34.             perror("sendto");    
  35.             exit(1);    
  36.         }    
  37.         sleep(1);    
  38.     }    
  39.     return 0;    
  40. }    

 

Recver.cpp

 

[c-sharp]  view plain copy print ?
 
  1. #include     
  2. #include     
  3. #include     
  4. #include     
  5. #include     
  6. #include     
  7. #include     
  8. #include     
  9. #include     
  10. #define HELLO_PORT  12345    
  11. #define HELLO_GROUP "225.0.0.37"    
  12. #define MSGBUFSIZE 256    
  13. int main(int argc, char *argv[])    
  14. {    
  15.     struct sockaddr_in addr;    
  16.     int fd, nbytes,addrlen;    
  17.     struct ip_mreq mreq;    
  18.     char msgbuf[MSGBUFSIZE];    
  19.     u_int yes=1;     
  20.         
  21.     if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
  22.     {    
  23.         perror("socket");    
  24.         exit(1);    
  25.     }    
  26.         
  27.         
  28.     if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0)     
  29.     {    
  30.         perror("Reusing ADDR failed");    
  31.         exit(1);    
  32.     }    
  33.         
  34.         
  35.     memset(&addr,0,sizeof(addr));    
  36.     addr.sin_family=AF_INET;    
  37.     addr.sin_addr.s_addr=htonl(INADDR_ANY);     
  38.     addr.sin_port=htons(HELLO_PORT);    
  39.         
  40.     if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    
  41.     {    
  42.         perror("bind");    
  43.         exit(1);    
  44.     }    
  45.         
  46.     mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);    
  47.     mreq.imr_interface.s_addr=htonl(INADDR_ANY);    
  48.     if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0)     
  49.     {    
  50.         perror("setsockopt");    
  51.         exit(1);    
  52.     }    
  53.         
  54.     while (1)     
  55.     {    
  56.         //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);    
  57.         addrlen=sizeof(addr);    
  58.         if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (socklen_t *)&addrlen)) < 0)     
  59.         {    
  60.             perror("recvfrom");    
  61.             exit(1);    
  62.         }    
  63.         puts(msgbuf);    
  64.     }    
  65.     return 0;    
  66. }    

 

Makefile

 

[cpp]  view plain copy print ?
 
  1. CC = gcc    
  2. CXX = g++    
  3. CFLAGS = -Wall -pipe -D_DEBUG -DDEBUG -g -O0    
  4. LDFLAGS = -lstdc++    
  5. RM = /bin/rm -f    
  6. MODULE_INC = -I../curl-7.21.3/include -I../boost_1_45_0 -I./    
  7. MODULE_LIB = -L../boost_1_45_0/stage/lib    
  8. CFLAGS  += $(MODULE_INC)    
  9. LDFLAGS += $(MODULE_LIB)    
  10. LIBOBJS = Sender.o Recver.o    
  11. TARGET = sender recver    
  12. all: $(TARGET)    
  13. sender: Sender.o    
  14.     $(CXX) -o $@ $^ $(LDFLAGS)    
  15. recver: Recver.o    
  16.     $(CXX) -o $@ $^ $(LDFLAGS)    
  17. clean:     
  18.     rm -f *.o    
  19.     rm -f $(TARGET)    
  20. # make rule    
  21. %.o : %.c    
  22.     $(CC) $(CFLAGS) -c $^ -o $@     
  23. %.o : %.cpp    
  24.     $(CC) $(CFLAGS) -c $^ -o $@     
  25. install:    
  26.     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

 

 

转载于:https://www.cnblogs.com/lifan3a/articles/6780360.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值