Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117766
  • 博文数量: 30
  • 博客积分: 2520
  • 博客等级: 少校
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 10:31
文章分类
文章存档

2009年(7)

2008年(23)

我的朋友

分类: C/C++

2008-03-06 21:07:20

利用linux socket实现异步聊天有2种方式:
 第一,利用多进程编程fork()函数实现
 第二,利用select()函数实现
本文采用多进程方式实现,利用select()函数实现的聊天还存在一些问题,以后调试好了再上传。。。。
本程序只实现了一些简单点对点聊天功能,
 
 
服务器:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

int sockfd,new_fd;
static void sig_exit(int signumber)
{  
   close(new_fd);
 close(sockfd);
}
main()
{
 struct sockaddr_in my_addr,their_addr;
 
 int ret;
 int flags;
 char buffer[100];
 char recvbuf[100];
 int maxfd;
 struct timeval tv;
 pid_t pid; 
 fd_set rfds; 
 tv.tv_sec=5;
 tv.tv_usec=0;
 sockfd=socket(AF_INET,SOCK_STREAM,0);
 if(sockfd<0)
 {
  printf("socket error");
  exit(0);
 }
 my_addr.sin_family=AF_INET;
 my_addr.sin_port=htons(9999);
 my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
 bzero(&(my_addr.sin_zero),8);
 ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
 if(ret<0)
 {
  printf("bind error");
  exit(0);
 }
 ret=listen(sockfd,10);
 if(ret<0)
 {
  printf("listen error");
  exit(0);
 }
 signal(SIGTTIN,SIG_IGN);
 while(1)
 {
 int sin_size=sizeof(struct sockaddr_in);
 new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size);
  if(new_fd<0)
   {
  printf("accept error");
  exit(0);
   }
 printf("server:got connect from %s\n",inet_ntoa(their_addr.sin_addr));
 if((pid=fork())==-1)
 {
  printf("fork error");
  exit(0);
 }
 else if(pid==0)
 {
  while(1)
  {    
    printf("input send data:");
    bzero(buffer,101);
    if(fgets(buffer,100,stdin)==NULL)
    {
     
     exit(0);
    }
    if(!strncasecmp(buffer,"quit",4))
    {
     send(new_fd,buffer,strlen(buffer),0);
     printf("quit\n");
     close(new_fd);
     close(sockfd);
     exit(0);
    }
    if(send(new_fd,buffer,strlen(buffer),0)==-1)
    {
     printf("send error");
     break;
    }
  }
 }
  
 else
 {
  signal(SIGCHLD,sig_exit); 
  
  while(1)
  {
   
   if((ret=read(new_fd,recvbuf,100))==-1)
    {
    
     exit(0);
    }
   recvbuf[ret]='\0';
   if(!strncasecmp(recvbuf,"quit",4))
    {
     close(new_fd);
     close(sockfd);
     exit(0); 
    } 
   printf("\nyou have message:%s",recvbuf);
  }
 } 
 
 break;   
}
}
 
客户端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int sockfd;
static void sig_exit(int signumber)
{  
  close(sockfd);
}
int main()
{
 int numbytes;
 int ret;
 char buffer[100];
 char recvbuf[100];
 fd_set rfds;
 pid_t pid; 
 
 struct hostent *he;
 int maxfd;
 struct sockaddr_in their_addr;
 if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
 {
  printf("socket error");
  exit(0);
 }
 their_addr.sin_family=AF_INET;
 their_addr.sin_port=htons(9999);
 their_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
 bzero(&(their_addr.sin_zero),8);
 if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
 {
  printf("connect error");
  exit(0);
 }
 signal(SIGTTIN,SIG_IGN);
while(1)
{
 if((pid=fork())==-1)
 {
  printf("fork error");
  exit(0);
 }
 else if(pid==0)
 {
  while(1)
  {    
    printf("input send data:");
    
    if(fgets(buffer,100,stdin)==NULL)
    {
     
     exit(0);
    }
    if(!strncasecmp(buffer,"quit",4))
    {
     send(sockfd,buffer,strlen(buffer),0);
     printf("quit\n");
     close(sockfd);
     exit(0);
    }
    if(send(sockfd,buffer,100,0)==-1)
    {
     printf("send error");
     exit(0);
    }
  }
        
 }
  
 else
 {
  signal(SIGCHLD,sig_exit); 
  while(1)
  {
   if((ret=read(sockfd,recvbuf,100))==-1)
    {
     printf("recv error");
     exit(0);
    }
    
   if(!strncasecmp(recvbuf,"quit",4))
    {
     close(sockfd);
     exit(0); 
    } 
   recvbuf[ret]='\0';
   printf("\nyou have message:%s",recvbuf);
  
  }
 } 
 }
}

阅读(1905) | 评论(2) | 转发(0) |
0

上一篇:linux socket网络程序

下一篇:感动天感动地

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

chinaunix网友2010-12-14 14:49:57

太谢谢了

chinaunix网友2010-09-27 10:41:10

请问再做一个这样的软件的时候是不是应该把服务端和客户端分别做成一个函数,每个用户都得有服务端和客户端才能实现聊天呢? 赐教