用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;
}