⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chat_svr.c

📁 linux
💻 C
字号:
#include <stdio.h>#include <os_defs.h>
#include <os_socket.h>
#include <os_thread.h>
#include <os_system.h>

/* 用一个fd_set 保存所有已经上线的客户端 */
volatile fd_set client_list;

/* 已经上线的socket的最小值和最大值*/
volatile OS_SOCKET minfd;
volatile OS_SOCKET maxfd;

/* 用于保护全局数据 */
THREAD_LOCK_T lock;
static void * thread_chat(void * arg)
{
	char buffer[128];
	int len,ll;
	
	OS_SOCKET fd,client_sock = (OS_SOCKET)arg;
	while(1)
	{
		if((len =recv(client_sock,buffer,sizeof(buffer),0)) < 0)
		{
			/* 客户端下线或网络出错 */
			OS_ThreadLock(&lock);
			
			FD_CLR(client_sock,&client_list);
			OS_SocketClose(client_sock);
			
			OS_ThreadUnLock(&lock);
			
			
			return (NULL);
		}
		
		OS_ThreadLock(&lock);
		/* 向所有客户端广播 */
		for(fd = minfd; fd <= maxfd ; fd++)
		{
			//pintf("fd=%d,isfd %d\n",fd,FD_ISSET(fd,&client_list));
			
			if((fd != client_sock) && FD_ISSET(fd,&client_list))					
				ll=send(fd,buffer,len,0);
		}
		OS_ThreadUnLock(&lock);
	}
	return NULL;
}int main(int argc,char *argv[]){		struct sockaddr_in client_addr;	int  addr_len;	unsigned short port = 8000;
	char * welcome_msg = "welcome to multi-thread chat server\n";		OS_SOCKET client_sock;	OS_SOCKET sock =-1;		OS_THREAD_T thread;			if(argc > 1)	{		port = (unsigned short)atoi(argv[1]);	}		printf(".9 = %d\n",sizeof(.9));		OS_SocketInit();
	
	
		printf("TCP chat server on port %d\n",port);	
	/* 第一步:创建一个TCP服务器 */    if(OS_OpenTCPServer(&sock,port) == OS_ERROR)
	{
		exit(-1);
	}
	            	printf("\t socket =%d\n",sock);		    /* 创建线程锁保护全局数据区*/
	OS_ThreadLockCreate(&lock);
	
	FD_ZERO(&client_list);
	
	minfd = 100000;
	maxfd = 0;        while(1)    {		addr_len = sizeof(struct sockaddr_in);				/* 第四步:调用accept 来创建新的跟客户端一一对应socket */      			client_sock = accept(sock,(struct sockaddr *)&client_addr,&addr_len);		printf("recv client (%s,%d) socket %d\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),client_sock); 		
		/* 每次一个客户端连接上来,在client_list增加一项 */
		OS_ThreadLock(&lock);
		
        if (client_sock > maxfd) {
			maxfd = client_sock;
		}	
		if (client_sock < minfd) {
			minfd = client_sock;
		}
		FD_SET(client_sock, &client_list); 
		
		
		OS_ThreadUnLock(&lock);
		
        send(client_sock,welcome_msg,strlen(welcome_msg)+1,0);
		/* 每一个客户端创建一个对应线程来处理接收*/
		OS_ThreadCreate(&thread,thread_chat,client_sock);    }    
	
	    OS_ThreadLockDestory(&lock);
	    closesocket(sock);
	        printf("TCP server exit\n");        OS_SocketInit();    exit(0);            	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -