linux c 组播编程

用linux   c写一个局域网的聊天室程序,基于组播来实现,为方便调试只在本机上实验,不和其他的机器通讯。 
加入组播的任何一个成员发送的消息,在组内的其他成员都能收到,已经写了一个组播消息发送的服务器端程序和客户端的消息监听程序并实现了组播功能,但是这 样仅仅是一个发送者和若干个接受者,还没有实现聊天室的功能,不知道应该怎么修改和整合代码来实现任意成员发送,其他成员都能接收到这样的功能.请大家给 予思路和方法,谢谢拉。 
附上服务器端程序和客户端程序: 

服务器端程序: 

#include   <stdio.h> 
#include   <sys/types.h> 
#include   <sys/socket.h> 
#include   <netinet/in.h> 
#include   <string.h> 
#include   <arpa/inet.h> 
#define   MAXBUF   256 

int   port=5000; 
char   *   multicast_addr= "224.0.1.1 "; 

int   main(int   argc,   char   *argv[]) 
{ 
int   s; 
struct   sockaddr_in   srv; 
char   buf[MAXBUF]; 

bzero(&srv,sizeof(srv)); 
srv.sin_family=AF_INET; 
srv.sin_addr.s_addr=inet_addr(multicast_addr); 
srv.sin_port=htons(port); 

s=socket(AF_INET,SOCK_DGRAM,0); 
if(s <0) 
{ 
perror( "Opening   socket "); 
return   0; 
} 

while(1) 
{ 
fgets(buf,MAXBUF,stdin); 
if(sendto(s,buf,strlen(buf),0,(struct   sockaddr*)&srv,sizeof(srv)) <0) 
{ 
perror( "sendto "); 
return   0; 
} 
else 
{ 
fprintf(stdout, "send   to   group   %s   :   %s\n ",multicast_addr,buf); 

} 
} 


return   1; 
} 

客户端程序: 

#include   <stdio.h> 
#include   <sys/types.h> 
#include   <sys/socket.h> 
#include   <netinet/in.h> 
#include   <arpa/inet.h> 
#define   MAXBUF   256 

int   port=5000; 
char   *   multicast_addr= "224.0.1.1 "; 

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

int   s,n; 
struct   sockaddr_in   srv,cli; 
int   cli_len=sizeof(cli); 
struct   ip_mreq   mreq; 
char   buf[MAXBUF]; 

bzero(&srv,sizeof(srv)); 
srv.sin_family=AF_INET; 
srv.sin_addr.s_addr=htonl(INADDR_ANY); 
srv.sin_port=htons(port); 

if((s=socket(AF_INET,SOCK_DGRAM,0)) <0) 
{ 
perror( "Opening   socket "); 
return   0; 
} 

if(bind(s,(struct   sockaddr*)&srv,sizeof(srv)) <0) 
{ 
perror( "bind "); 
return   0; 
} 

mreq.imr_multiaddr.s_addr=inet_addr(multicast_addr); 
mreq.imr_interface.s_addr=htonl(INADDR_ANY); 

if(setsockopt(s,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) <0) 
{ 
perror( "setsockopt:   IP_ADD_MEMBERSHIP "); 
return   0; 
} 

while(1) 
{ 
if((n=recvfrom(s,buf,MAXBUF,0,(struct   sockaddr*)&cli,&cli_len)) <0) 
{ 
perror( "recvfrom "); 
return   0; 
} 
else 
{ 
buf[n]=0; 
fprintf(stdout, "receive   msg   from   %s   : 
  %s\n ",inet_ntoa(cli.sin_addr),buf); 
} 
} 


return   1; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值