Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60005
  • 博文数量: 17
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 195
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-01 14:14
文章分类

全部博文(17)

文章存档

2011年(1)

2009年(16)

我的朋友

分类: LINUX

2009-04-24 09:42:52

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


return   1;
}
阅读(4245) | 评论(1) | 转发(0) |
0

上一篇:linux pthread

下一篇:vi使用

给主人留下些什么吧!~~

chinaunix网友2009-07-22 16:14:05

让同一个程序 既能收又能发 是否可以