免费注册 查看新帖 |

Chinaunix

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

多线程的聊天室 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-29 20:01 |只看该作者 |倒序浏览

                                                                                功能比较简单,呵呵
服务端:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int  sock; /* POSIX用int 来描述socket */
/* 多线程 TCP chat 服务器*/
#define MAX_USERS 30
/* 在线用户表,用下标表示对应的socket, online_user[8] =1 ,表示socket fd =8的socket 在线,=0表示下线*/
char online_user[MAX_USERS];
/* 用来保护在线用户表 online_user*/
pthread_mutex_t user_lock;
void exit_handler(int sig)
{
     close(sock);
     pthread_mutex_destroy(&user_lock);
         exit(0);
}
void * thread_fn(void *arg)
{
       char buffer[1024];
            int len,fd;
            
     
      int client_sock  = (int)arg;
      
      while(1)
              {
              /* 接收客户端数据*/
        len = recv(client_sock,buffer,sizeof(buffer)-1,0);
        if(len 1)
       {
             port = (unsigned short )atoi(argv[1]);
       }
      
       /* ------------第一步:创建socket ----------------*/
   sock = socket(PF_INET,SOCK_STREAM,0); /* ipv4,TCP,任意协议 */
   if(sock == -1)
       {
       perror("socket");
       exit(-1);
       }
      
       fprintf(stdout,"TCP char Server ,listen on %d,pit %d\n",port,getpid());
      
       /* ----------------第二步:绑定端口和网卡----------------------*/
   /* struct socketaddr_in 来指明这个SOCKET绑定在本地的哪一个的端口和哪一块网卡*/
     memset((void *)&local_addr,0,sizeof(local_addr));
     
    local_addr.sin_family = AF_INET ; /* ip v4 */
    local_addr.sin_port = htons(port); /* 端口号,要用网络序*/
   
       /* 可以取值 INADDR_ANY 表示这个socket可以这一台机器所有网卡上进行通信*/
       /* 如果本机一个某一个网卡的IP地址,表示只在这一块网卡进行通信*/
    local_addr.sin_addr.s_addr = INADDR_ANY;  /* INADDR_ANY = 0x0 */
   
       {
         int val = 1;
         setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof (val));

       }
      
   
    if(bind(sock,(struct sockaddr *)&local_addr,sizeof(local_addr)) == -1)
         {
        perror("bind");
        close(sock);
        exit(-2);
                  
         }
      
       /* ----------第三步:通知内核的PS开始侦听客户端请求-------------*/
    if(listen(sock,20) == -1)
        {
        perror("listen");
        close(sock);
        exit(-3);
               
        }
        
        
        /* 清空在线用户表,初始化锁*/
     for(i=0 ; i  MAX_USERS)
                        {
               char * close_msg = "online user too many";
              fprintf(stdout,"new socket %d is too big,max user is %d\n",client_sock,MAX_USERS);
               send(client_sock,close_msg,strlen(close_msg)+1,0);
              close(client_sock);
              continue;
                        }
                        
                         /* 发送欢迎信息*/
          send(client_sock,welcome_msg,strlen(welcome_msg)+1,0);
                        
                         /* 把新联接的socket加入到在线用户表当中*/
         pthread_mutex_lock(&user_lock);
         online_user[client_sock] =1;
         pthread_mutex_unlock(&user_lock);
         
                                    
         fprintf(stdout,"client addr %s,port %d,sock %d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),client_sock);
         
        pthread_create(&th,NULL,thread_fn,(void *)client_sock);
                  
         }
        
      
      
      
       exit_handler(100);
      
}
客户端:代码比较简单
               
               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/108685/showart_2134666.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP