免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1246 | 回复: 0
打印 上一主题 下一主题

[网络] 写了一个linux下聊天室程序,聊天部分出现一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-02 20:58 |只看该作者 |倒序浏览
本帖最后由 wu309785731 于 2013-08-02 21:24 编辑

刚学linux编程不久,就急着上手写点东西,现在写到对话部分,群聊是没问题,就私聊遇到问题,这里将输入的首字母作为区分,‘#’为群聊,‘$’为私聊,以下是服务端和客户端部分代码,
  int  speakall(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[60];
     int filesocket;
     
     struct tm *pt;
     time_t t;
     char option;
     char buf1[MAX_RECVSIZE];
     char buf2[MAX_TEXTSIZE];
     char id[10];
     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[0];
                 
               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[i-1]=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[MAX_TEXT];
     char flag;
     running=1;
     int i;
     char socket[6];
     memset(socket,0,6);
     char filename[50];
     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[0];
           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[50];
     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[0];
                    switch(option)
                     {
                          .......
                     }
                 }
               if(buf[0]=='@')
                {
                    .........
                }
                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个发送,那为什么第一个可以,第二个就不行,和线程设计有关吗(用户登录部分设计了一个线程,让多用户登录)?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP