- 论坛徽章:
- 0
|
/* 这是一个简易的多线程多点播送聊在室服务器端,在其稳定性上希望大家能给出意见,以下是编译环境: 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,&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,&buffer,(socklen_t)sizeof(buffer),0);/* 发送消息到各个客户端 */
p=p->;link;
}
/* nsend=send(socks,&buffer,(socklen_t)sizeof(buffer),0); */
}
else
{
printf("\nTcp connect error!\n" ;
q=head;
for(;q->;conn_socket!=socks&&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(&attr);
pthread_attr_setdetachstate(&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(&(server_addr.sin_zero), ;
if(bind(sockfd,&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,&server_addr,&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(&tid,&attr,(void *)&recv_person,(void *)connfd)!=0)
{
fprintf(stderr,"Create Thread Error:%s\n\a",strerror(errno));
exit(1);
}
}
close(connfd);
} |
|