免费注册 查看新帖 |

Chinaunix

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

一个多线程聊天室服务器,请大家讨论互斥及其它高见 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-10 17:13 |只看该作者 |倒序浏览
/*  这是一个简易的多线程多点播送聊在室服务器端,在其稳定性上希望大家能给出意见,以下是编译环境: red hat linux 7.0   gcc -o server server.c -lpthread */
#include <sys/types.h>;
#include <sys/socket.h>;
#include <netinet/in.h>;
#include <sys/stat.h>;

#include <pthread.h>;
#include <unistd.h>;
#include <netdb.h>;
#include <stdio.h>;
#include <errno.h>;
#include <malloc.h>;

#define SERVER_PORT 8005
#define MAX_BUF_SIZE 1024
/* 定义互斥变量 */
pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;

typedef struct node
{
  int conn_socket;
  struct node *link;
}stud;
stud *head;

void recv_person(void *sock)/*线程函数 */
{
stud *p,*q;
int  nrecv,nsend,socks;
char buffer[MAX_BUF_SIZE];

socks=(int)sock;

for(;
{
  bzero(buffer,MAX_BUF_SIZE);
  if((nrecv=recv(socks,&amp;buffer,(socklen_t)sizeof(buffer),MSG_WAITALL))!=0)/* 接收信息 */
  {
      printf("\n%s\n",buffer);

      p=head->;link;
      while(p!=NULL)、/*遍历套接字链表*/
      {
        printf("\n%d+\n",p->;conn_socket);
        nsend=send(p->;conn_socket,&amp;buffer,(socklen_t)sizeof(buffer),0);/* 发送消息到各个客户端 */
        p=p->;link;
      }

    /*  nsend=send(socks,&amp;buffer,(socklen_t)sizeof(buffer),0); */
  }
  else
     {
      printf("\nTcp connect error!\n";
      q=head;
      for(;q->;conn_socket!=socks&amp;&amp;q->;link!=NULL;p=q,q=q->;link);
      if(q->;conn_socket==socks)
      {
        p->;link=q->;link;/* 从链表中删除以断开的套接字结点 */
        free(q);   
      }
      p=head->;link;
      while(p!=NULL)
      {
        printf("\n%d-\n",p->;conn_socket);
        p=p->;link;/* 显示连接情况 */
      }
   
      close(socks);
      break;      
     }
}
close(socks);
}

main()
{
  int sockfd;
  int connfd;
  int namelen;

  stud *p,*s;
  
  pthread_attr_t attr;
  pthread_t      tid;

  struct sockaddr_in server_addr;
  
  pthread_attr_init(&amp;attr);
  pthread_attr_setdetachstate(&amp;attr,PTHREAD_CREATE_DETACHED);



  sockfd=socket(AF_INET,SOCK_STREAM,0);
  if(sockfd<0)
  {
  fprintf(stderr,"socket error!\n";
  exit(1);
  }
  server_addr.sin_family=AF_INET;
  server_addr.sin_addr.s_addr=INADDR_ANY;
  server_addr.sin_port=htons(SERVER_PORT);

  bzero(&amp;(server_addr.sin_zero),;

  if(bind(sockfd,&amp;server_addr,sizeof(server_addr))<0)
   {
    fprintf(stderr,"bind error!\n";
    exit(2);
   }
  if(listen(sockfd,2)<0)
   {
    fprintf(stderr,"listen error!\n";
    exit(3);
   }else{
          printf("\n-Creat Listen!-\n";
        }
if((head=(stud *)malloc(sizeof(stud)))==NULL)
{
  printf("Don't create place!";
  exit(0);
}else
      {
        head->;conn_socket=0;
        head->;link=NULL;
        p=head;
      }

namelen=sizeof(server_addr);
for(;
{
   if((connfd=accept(sockfd,&amp;server_addr,&amp;namelen))<0)
      {
        fprintf(stderr,"accept error!\n";
        exit(1);
      }

   if((s=(stud *)malloc(sizeof(stud)))==NULL)
     {
       printf("Don't create place!";
       exit(0);
     }else
         {
           s->;conn_socket=connfd;  
           s->;link=p->;link;
           p->;link=s;
         }

   if(pthread_create(&amp;tid,&amp;attr,(void *)&amp;recv_person,(void *)connfd)!=0)
     {
        fprintf(stderr,"Create Thread Error:%s\n\a",strerror(errno));
        exit(1);      
     }
}
close(connfd);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP