CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

SOCKET聊天室程序求助(有源程序)100分

楼主aeh(来转转)2005-05-18 19:11:32 在 Linux/Unix社区 / 程序开发区 提问

上次的TALK程序老师说内容太少了,只好再换  
  从书上抄的聊天室程序,C/S模式,好象缺了个config文件,而书上又没说在哪  
  给一百分,希望能得到调试成功后的程序  
   
  /*inet.h*/  
  #ifndef   __INET_H__  
  #define __INET_H__  
  #include   <stdio.h>  
  #include   <string.h>  
  #include   <sys/types.h>  
  #include   <sys/socket.h>  
  #include   <netinet/in.h>  
  #include   <arpa/inet.h>  
  #include   <fcntl.h>  
  #include   <sys/time.h>  
  #include   <unistd.h>  
  #include   <sys/time.h>  
   
  #define MAX_CLIENT 10  
  #define   READ                         0  
  #define   WRITE                       1  
  #define   MAX_LINE                 1000  
  #define   MAX_NAME                 100  
  #define   SETNAME   "/name"  
  #define   __SELECT__  
   
  #endif  
   
  客户端  
  #include   "inet.h"  
  #include   <signal.h>  
  #include   <ctype.h>  
   
  extern     int   init_cli();  
   
  void         add_set(   fd_set   *sockset,   int   sockfd)  
  {  
          FD_ZERO(   sockset);  
          FD_SET(   sockfd,   sockset);  
          FD_SET(   0,   sockset);  
  }  
   
  int           main(   void)  
  {  
  int sockfd;  
  int status;  
  char str[MAX_LINE];  
          char         name[MAX_NAME];  
   
          fd_set     sockset;  
   
  sockfd   =   init_cli();  
  if   (   sockfd   ==   0)   {  
  printf(   "Init   client   socket   error.\n");  
  fflush(   stdout);  
  exit(   1);  
  }  
           
          add_set(   &sockset,   sockfd);  
   
          fprintf(   stdout,   "Please   input   your   name:");  
          fscanf(   stdin,   "%s",   name);  
          strcpy(   str,   "/");  
          strcat(   str,   name);  
          write(   sockfd,   str,   strlen(   str));  
   
          while   (   1)   {  
                  select(   sockfd+1,   &sockset,   NULL,   NULL,   NULL);  
                  if   (FD_ISSET(   sockfd,   &sockset))   {  
                          status   =   read(   sockfd,   str,   MAX_LINE);  
                          if   (   status   ==   0)   exit(0);    
                          str[status]   =   '\0';  
                          printf(   "%s",   str);  
                          fflush(   stdout);  
                  }  
                  if   (   FD_ISSET(   0,   &sockset))   {  
                          status   =   read(   0,   str,   MAX_LINE);  
                          str[status]   =   '\0';  
                          if   (   str[0]   ==   'q')   {  
                                  sprintf(   str,   "%s   leave   the   room.\n",   name);  
                                  write(   sockfd,   str,   strlen(   str));  
                                  close(   sockfd);  
                                  exit(   0);  
                          }  
                          if   (   write(   sockfd,   str,   strlen(str))   !=   strlen(   str)   )   {  
                                  printf(   "Write   error\n");  
                                  exit(0);  
                          }  
                  }    
                  add_set(   &sockset,   sockfd);  
        }  
        return   1;  
  }  
   
  int init_cli(   void)    
  //   Return   sockfd   if   successful,   else   0  
  {  
   
  int   sockfd;  
  int SERV_TCP_PORT;  
  char SERV_HOST_ADDR[MAX_LINE];  
  FILE         *fd;  
  struct sockaddr_in serv_addr;  
   
  fd   =   fopen(   "config",   "r");  
  fgets(   SERV_HOST_ADDR,   MAX_LINE,   fd);  
  fscanf(   fd,   "%d",   &SERV_TCP_PORT);  
  fclose(   fd);  
   
  bzero(   (char*)&serv_addr,   sizeof(   serv_addr));  
  serv_addr.sin_family       =AF_INET;  
  serv_addr.sin_addr.s_addr   =inet_addr(   SERV_HOST_ADDR);  
  serv_addr.sin_port     =htons(   SERV_TCP_PORT);  
   
  if   (   (   sockfd   =   socket(   AF_INET,SOCK_STREAM,0))<0)   {  
  printf(   "client:can`t   open   stream   socker.\n");  
  fflush(   stdout);  
  return(   0);  
  }  
   
  if   (   connect(   sockfd,   (   struct   sockaddr   *)&serv_addr,    
  sizeof(   serv_addr))<0)   {  
  printf(   "client:can`t   connect   to   server\n");  
  fflush(   stdout);  
  return(   0);  
  }  
  return(   sockfd);  
  }  
   
  服务器端  
  /*server.c*/  
  #include   <signal.h>  
  #include   <sys/wait.h>  
  #include   "inet.h"  
   
  int           init_ser(   int);    
  int           max(   int   a,   int   b)  
  {  
          int           themax;  
   
          if   (   a   >   b)   themax   =   a;  
          else   themax   =   b;  
          return   themax;  
  }  
   
  void         set_name(   char   *line,   char   *name)    
  {  
          strcpy(   name,   &line[1]);  
          sprintf(   line,   "%s   join   the   room\n",   name);  
  }  
   
  void         add_name(   char   *line,   char   *name)  
  {  
          char         theline[MAX_LINE];  
   
          strcpy(   theline,   name);  
          strcat(   theline,   "   :   ");  
          strcat(   theline,   line);  
          strcpy(   line,   theline);  
  }  
   
  int user_free(   int   user_link[MAX_CLIENT])  
  {  
  int i   =   0;  
   
  while   (   (   user_link[i]   !=   0)&&(   i<MAX_CLIENT))   i++;  
  if   (   i   ==   MAX_CLIENT)   return(   -1);  
  return(   i);  
  }  
   
  void         add_sockset(   fd_set   *sockset,   int   sockfd,   int   *user_link,   int   *userfd)  
  {  
          int           i;  
   
          FD_ZERO(   sockset);  
          FD_SET(   sockfd,   sockset);  
          for   (   i=0;   i<MAX_CLIENT;   i++)   {  
                  if   (   user_link[i]   ==   1)   {  
                          FD_SET(   userfd[i],   sockset);  
                  }  
          }  
  }  
   
  int           main(   void)  
  {  
  int sockfd;  
  int new_sockfd;  
  int user_link[MAX_CLIENT];  
  int   userfd[MAX_CLIENT];  
          char         username[MAX_CLIENT][MAX_NAME];  
          char         line[MAX_LINE];  
  int userCount;  
  unsigned         int cli_len;  
  struct sockaddr_in cli_addr;  
          FILE         *file;  
          int           port;  
          int           length,   i,   j;  
          fd_set     sockset;  
          int           maxfd   =   0;  
   
          file   =   fopen(   "config",   "r");  
          fgets(   line,   MAX_LINE,   file);  
          fscanf(   file,   "%d",   &port);  
          fclose(   file);  
          printf   (   "%d   \n",   port);  
          sockfd   =   init_ser(   port);  
   
  if   (   sockfd   ==   0)   {  
  printf(   "Init   server   socket   error\n");  
  fflush(   stdout);  
  exit(1);  
  }   //Socket   init   done  
   
  listen(   sockfd,   MAX_CLIENT);  
  cli_len   =   sizeof(   cli_addr);  
  for   (   i   =   0;   i<MAX_CLIENT;   i++)   {  
  user_link[i]   =   0;  
                  username[i][0]   =   '\0';  
          }  
  userCount   =   0;  
          FD_ZERO(   &sockset);  
          FD_SET(   sockfd,   &sockset);  
          maxfd   =   max(   maxfd,   sockfd+1);  
   
  for   (   ;   ;)   {  
                  select(   maxfd,   &sockset,   NULL,   NULL,   NULL);  
  if   (   FD_ISSET(   sockfd,   &sockset)    
                          &&   (userCount   =   user_free(   user_link))   >=0)   {    
  new_sockfd   =   accept(   sockfd,   (struct   sockaddr*)&cli_addr,  
  &cli_len);  
  if   (   new_sockfd   <   0)   {  
  user_link[userCount]   =   0;  
                                  printf(   "acc   error\n");  
  }   else   {  
  user_link[userCount]   =   1;  
                                  userfd[userCount]   =   new_sockfd;  
                                  FD_SET(   new_sockfd,   &sockset);  
                                  maxfd   =   max(   maxfd,   new_sockfd+1);  
                          }  
                  }   //   if   userCount   >=   0  
                  for   (   i=0;   i<MAX_CLIENT;i++)   {  
                          if   (   (   user_link[   i]   ==   1)    
                                  &&   (FD_ISSET(   userfd[i],   &sockset)))   {  
                                  length   =   read(   userfd[i],   line,   MAX_LINE);  
                                  if   (   length   ==   0)   {   //   socket   is   closed.  
                                          user_link[i]   =   0;  
                                          username[i][0]   =   '\0';  
                                          FD_CLR(   userfd[i],   &sockset);  
                                  }   else   if   (   length   >0)   {  
                                          line[length]   =   '\0';  
                                          if   (   (line[0]   ==   '/')&&(username[i][0]   ==   '\0'))   {  
                                                  set_name(   line,   username[i]);  
                                          }   else   {  
                                                  add_name(   line,   username[i]);  
                                          }  
                                          for   (   j=0;   j<MAX_CLIENT;   j++)   {  
                                                  if   (   (j   !=   i)&&(user_link[j]==1))   {  
                                                          write(   userfd[j],   line,   strlen(   line));  
                                                  }  
                                          }  
                                  }   //   length   >0  
                          }   //   user_link[i]   ==   1  
                  }   //   for                                  
                  add_sockset(   &sockset,   sockfd,   user_link,   userfd);  
  }   //   for  
          return   0;  
  }  
   
  int init_ser(   int   port)  
  //If   success,   return   sockfd,   else   return   0  
  {  
   
  int SERV_TCP_PORT;  
  int sockfd;  
  struct sockaddr_in serv_addr;  
   
          SERV_TCP_PORT   =   port;  
   
  if   (   (   sockfd   =   socket(   AF_INET,SOCK_STREAM,0))<0)   {  
                  perror(   "socket:");  
  printf(   "server:can`t   open   stream   socker.\n");  
  fflush(   stdout);  
  return(   0);  
  }  
   
  bzero(   (   char*)&serv_addr,   sizeof(   serv_addr));  
  serv_addr.sin_family       =AF_INET;  
  serv_addr.sin_addr.s_addr   =htonl(   INADDR_ANY);  
  serv_addr.sin_port     =htons(   SERV_TCP_PORT);  
   
  if   (   bind(   sockfd,   (   struct   sockaddr   *)&serv_addr,    
  sizeof(   serv_addr))<0)   {  
                  perror(   "bind:");  
  printf(   "server:   can`t   bind   local   address\n");  
  fflush(   stdout);  
  return(   0);  
  }  
  return(   sockfd);   //successful.  
  }  
   
   
   
   
   
  /*Makefile*/  
   
   
  BINS=  
  MBINS=client   server  
   
  all:   $(BINS)   $(MBINS)  
   
  $(BINS):   %   :   %.o  
  $(CC)     -o   $@   $<  
   
  $(MBINS):   %   :   %.o    
  $(CC)     -o   $@   $<  
   
  clean:  
  -rm   -f   *.o   $(BINS)   $(MBINS)  
  问题点数:100、回复次数:5Top

1 楼bingo0lin(bingo)回复于 2005-05-18 20:22:55 得分 10

mark  
  Top

2 楼silinglovelinux(司令lovelinux)回复于 2005-05-18 22:38:11 得分 80

兄弟太懒了吧,自己看一下程序,自己就可以知道config   文件的内容,config文件的内容是:ip地址和端口。自己创建一个config文件,ip   地址设置为你运行这个程序的ip地址,端口自己任选。分两行写。例:  
  192.168.10.99  
  888  
  然后分别拷贝各个文件的内容,分别为inet.h   client.c   server.c   Makefile   然后加上config.  
  执行make,运行./server     ./client.client可以运行多个。Top

3 楼qfxx(秋风萧萧)回复于 2005-05-19 10:50:47 得分 10

晕作业Top

4 楼aeh(来转转)回复于 2005-05-19 16:54:33 得分 0

哎~~~~~  
  可怜啊  
  我总是停留在#xxxxx   xxxx上  
  没想到直接写IP   PORT就可以  
  哈哈  
  我的毕业设计算完成了  
  下面就是怎么应付答辩了  
  谢谢各位Top

5 楼Magicesp(流浪汉)回复于 2005-05-19 20:43:56 得分 0

嘿!Top

相关问题

  • 源程序
  • c源程序。
  • 求源程序!
  • 求最简单聊天室源程序
  • 求最简单聊天室源程序
  • ****寻求源程序*****
  • 寻找源程序!
  • 交换源程序
  • 源程序测试!
  • 源程序加密

关键词

  • socket
  • client
  • sockset
  • sockfd
  • theline
  • themax
  • 程序
  • line
  • cli
  • inet

得分解答快速导航

  • 帖主:aeh
  • bingo0lin
  • silinglovelinux
  • qfxx

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo