wu309785731 发表于 2013-08-02 20:58

写了一个linux下聊天室程序,聊天部分出现一个问题

本帖最后由 wu309785731 于 2013-08-02 21:24 编辑

刚学linux编程不久,就急着上手写点东西,现在写到对话部分,群聊是没问题,就私聊遇到问题,这里将输入的首字母作为区分,‘#’为群聊,‘$’为私聊,以下是服务端和客户端部分代码,
intspeakall(LinkList L,char buf[],int size)//群聊函数。链表节点为存储用户的信息结构体
{
   
      LinkList p;
      int socket;
      if(!L)
          return -1;
      p=L->next;
      while(p!=NULL)
      {
      if(p->user.state==1)
         {
             socket=p->user.mysockfd;
             sendto_client(&socket,buf,size);
         }
          p=p->next;
      }
}
int chat_server(int *socket,char name[])
{
   int i;
   int len;
   int running=1,recvsize;
   
   char filepath;
   int filesocket;
   
   struct tm *pt;
   time_t t;
   char option;
   char buf1;
   char buf2;
   char id;
   int destsocket;

    memset(buf2,0,MAX_TEXTSIZE);
   sprintf(buf2,"%s 上线 !\n",name);
   speakall(L,buf2,strlen(buf2));

    while(1)
      {
            memset(id,0,10);
            memset(buf1,0,MAX_RECVSIZE);
            memset(buf2,0,MAX_TEXTSIZE);
            memset(filepath,0,60);

             if((recvsize=recv(*socket,buf1,MAX_RECVSIZE,0))<=0)
               {
                     perror("recv";
                     printf("用户 %s 掉线 \n",name);
                     pthread_exit(NULL);
               }
               
               option=buf1;
               
               switch(option)
                  {
                      case '#'://群聊
                           {
                              time(&t);
                              pt=localtime(&t);
                           
                              sprintf(buf2,"%s 对大家说%02d:%02d:%02d)\n %s",name,pt->tm_hour,pt->tm_min,pt->tm_sec,buf1);
                              speakall(L,buf2,strlen(buf2));
                              break;                        
                        }
                     case '$'://私聊
                           {
                               time(&t);
                               pt=localtime(&t);
                              
                               for(i=1;((buf1!=' ') && (i<MAX_RECVSIZE));i++)
                                 id=buf1;//提取要私聊人的名字
                              if((LocateName(L,id)<0) || i==1 || (i>MAX_RECVSIZE))
                                        break;
                              destsocket=LocateUsersocket(L,id);
                              sprintf(buf2,"%s 对你说 %02d:%02d:%02d\n%s\n)",name,pt->tm_hour,pt->tm_min,pt->tm_sec,buf1);
                              
                              sendto_client(&destsocket,buf2,strlen(buf2)+1);
                              break;
                           }
                     case '@' :
                           {
                              ..........................
                           }
                  }
      }

}
客户端省略部分代码
void pthread_chat()//此处开辟线程是为了收集来自服务器的信息,并发送给另个进程显示信息
{
   int len;
   int chat_fd;
   char buf;
   char flag;
   running=1;
   int i;
   char socket;
   memset(socket,0,6);
   char filename;
   if((chat_fd=open(chatdata_path,O_APPEND |O_WRONLY,0666))<0)
       {
            perror("open");
       }
       my_message msg;
       msg.message_type=1;
       while(running)
       {
         memset(buf,0,MAX_TEXT);
         recvfrom_server(buf,MAX_TEXT);
         flag=buf;
         if(flag=='!')
             {
               .....无关聊天省略
             }
         strcpy(msg.buf,buf);
          if(msgsnd(msg_id,(void *)&msg,MAX_TEXT,0)==-1)
          {
               perror("msgsnd");
               exit(-1);
          }
       }
}
int chat_client()
{
   pthread_t pid;
   if(pthread_create(&pid,NULL,(void *)pthread_chat,NULL)<0)
      {
             perror("pthread_create");
             exit(-1);
      }
   int sendsize;
   char buf;
   char option;
   int i;
   running=1;
   recvfrom_server(buf,50);
   printf("%s\n",buf);
   while(running)
          {
               memset(buf,0,50);
               fgets(buf,50,stdin);
               printf("buf=%s\n",buf);
               if(confirm==1)
               {
                  option=buf;
                  switch(option)
                     {
                        .......
                     }
               }
               if(buf=='@')
                {
                  .........
                }
                sendsize=strlen(buf);
                if(sendsize)
                {
                     printf("1\n");
                   if(send(socketSrv,buf,sendsize,0)==-1)
                     {
                            perror("send");
                            exit(-1);
                     }
                   printf("2\n");
                }
          }
         return 0;
}这里的信息显示我是通过进程间通讯发送到另外个程序显示,也就死是2个终端为一个客户,现在的问题是登录2个用户之后,第一个登录的能发起私聊,第二个登录可以群聊,但是一发送私聊就出错,很是纳闷,也没调出个结果,报的是这个错误 send: Bad file descriptor,是发送有什么问题吗,以上就涉及客户端和服务端2个发送,那为什么第一个可以,第二个就不行,和线程设计有关吗(用户登录部分设计了一个线程,让多用户登录)?
页: [1]
查看完整版本: 写了一个linux下聊天室程序,聊天部分出现一个问题