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