?? chat_svr.c
字號:
#include <stdio.h>#include <os_defs.h>
#include <os_socket.h>
#include <os_thread.h>
#include <os_system.h>
/* 用一個fd_set 保存所有已經(jīng)上線的客戶端 */
volatile fd_set client_list;
/* 已經(jīng)上線的socket的最小值和最大值*/
volatile OS_SOCKET minfd;
volatile OS_SOCKET maxfd;
/* 用于保護(hù)全局?jǐn)?shù)據(jù) */
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)
{
/* 客戶端下線或網(wǎng)絡(luò)出錯 */
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);
/* 第一步:創(chuàng)建一個TCP服務(wù)器 */ if(OS_OpenTCPServer(&sock,port) == OS_ERROR)
{
exit(-1);
}
printf("\t socket =%d\n",sock); /* 創(chuàng)建線程鎖保護(hù)全局?jǐn)?shù)據(jù)區(qū)*/
OS_ThreadLockCreate(&lock);
FD_ZERO(&client_list);
minfd = 100000;
maxfd = 0; while(1) { addr_len = sizeof(struct sockaddr_in); /* 第四步:調(diào)用accept 來創(chuàng)建新的跟客戶端一一對應(yīng)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);
/* 每一個客戶端創(chuàng)建一個對應(yīng)線程來處理接收*/
OS_ThreadCreate(&thread,thread_chat,client_sock); }
OS_ThreadLockDestory(&lock);
closesocket(sock);
printf("TCP server exit\n"); OS_SocketInit(); exit(0); }
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -