📄 tcp_chat_svr.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <os_socket.h>
#include <os_thread.h>
#include <os_system.h>
/* 用于记录已经联接客户端*/
volatile fd_set the_state;
volatile OS_SOCKET minfd;
volatile OS_SOCKET maxfd;
THREAD_LOCK_T mutex_state;
void usage()
{
printf("tcp_chat_svr port \n");
}
int main(int argc ,char * argv[])
{
OS_SOCKET socket = INVALID_SOCKET;
int port;
if(argc<2)
{
usage();
exit(-1);
}
port = atoi(argv[1]);
if((port <= 1024 ) || (port >65000))
{
fprintf(stderr,"error port %s\n",argv[1]);
exit(-2);
}
OS_SocketInit();
if(OS_OpenTCPServer(&socket, port)!=OS_OK)
{
fprintf(stderr,"create tcp file server failure on %d\n",port);
exit(-3);
}
printf("chat server runing on port %d,socket=%d\n",port,socket);
handle_client_request(socket);
OS_SocketClose(socket);
OS_SocketClear();
exit(0);
}
static void tcp_server_read(void *arg)
{
OS_SOCKET rfd;
rfd = (OS_SOCKET)arg;
for(;;) {
char buf[512];
int buflen;
OS_SOCKET wfd;
/* lese Meldung */
buflen = recv(rfd, buf, sizeof(buf), 0);
if (buflen <= 0) {
/* 用户下线,将这一记录从全局数组移走*/
OS_ThreadLock(&mutex_state);
FD_CLR(rfd, &the_state);
printf("client socket %d offline\n",rfd);
OS_ThreadUnLock(&mutex_state);
OS_SocketClose(rfd);
OS_ThreadExit();
}
/* 向所有客户端发送信息 */
OS_ThreadLock(&mutex_state);
for (wfd = minfd ; wfd <= maxfd; ++wfd) {
if (FD_ISSET(wfd, &the_state) && (rfd != wfd)) {
send(wfd, buf, buflen,0);
}
}
OS_ThreadUnLock(&mutex_state);
}
}
int handle_client_request(OS_SOCKET listen_fd)
{
struct sockaddr_in client_addr;
int addr_size ;
OS_SOCKET new_sock;
OS_THREAD_T thread_id;
char * msg="Welcome to chat server!";
addr_size = sizeof(struct sockaddr_in);
FD_ZERO(&the_state);
minfd = maxfd = listen_fd;
OS_ThreadLockCreate(&mutex_state);
for(;;)
{
if((new_sock = accept(listen_fd,(struct sockaddr *)&client_addr,&addr_size))<= 0)
continue;
printf("client socket=%d (ip=%s:port=%d) connected\n",new_sock,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
/* 在线程锁的保护下,把新的客户端加入全局fd_set中*/
OS_ThreadLock(&mutex_state);
if (new_sock > maxfd) {
maxfd = new_sock;
}
if (new_sock < minfd) {
minfd = new_sock;
}
FD_SET(new_sock, &the_state);
OS_ThreadUnLock(&mutex_state);
send(new_sock,msg,strlen(msg),0);
/* 为每个客户端创建一个线程来处理*/
OS_ThreadCreate(&thread_id, tcp_server_read, (void *)new_sock);
}
OS_ThreadLockDestory(&mutex_state);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -