linux cマルチキャストプログラミング


linux cでローカルエリアネットワークのチャットルームプログラムを書き、マルチキャストに基づいて実現し、デバッグを容易にするために本機で実験するだけで、他の機械と通信しない. 
マルチキャストに参加した任意のメンバーが送信したメッセージは、グループ内の他のメンバーが受信でき、1つのマルチキャストメッセージが送信されたサーバ側プログラムとクライアントのメッセージリスナーを書いてマルチキャスト機能を実現したが、これは1つの送信者と複数の受信者だけであり、チャットルームの機能はまだ実現されていない.どのようにコードを修正して統合して任意のメンバーの送信を実現すべきか分かりませんが、他のメンバーはこのような機能を受信することができます. 
サーバー・エンド・プログラムとクライアント・プログラムを添付します.
サーバ側プログラム:
#include    
#include    
#include    
#include    
#include    
#include    
#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
",multicast_addr,buf); } } return 1; }

クライアントプログラム:
#include    
#include    
#include    
#include    
#include    
#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
",inet_ntoa(cli.sin_addr),buf); } } return 1; }