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

📄 tcp_chat_svr.c

📁 linux下的多个网络通讯的例子 可多参考下
💻 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 + -