📄 chat_svr.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 + -