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

📄 tcp_select_cli.c

📁 linux下的多个网络通讯的例子 可多参考下
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <os_defs.h>
	


#include <os_socket.h>

/* 
  客户端采用select来实现多路复用,只使用一个进程来完成所有处理
  软件开销较少

  同时监控输入和socket进行处理

  
 */

void usage()
{
   printf("tcp_select_cli port addr \n");
}


int main(int argc ,char * argv[])
{

    int port;

   OS_SOCKET socket = INVALID_SOCKET;


  char key_buf[512],recv_buf[512];
   int fd,addr_len,len;
   struct sockaddr_in addr;

   fd_set readfds;
   	
   if(argc<3)
   	{
          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_OpenTCPClient(&socket,argv[2], port)!=OS_OK)
    	{
    	   fprintf(stderr,"connect tcp file server %s:%d failure on \n",argv[2],port);
    	   exit(-3);
    	}

     while(1)	
     	{
     	    FD_ZERO(&readfds);
	    /* 把标准输入和socket同时加入监控*/
           FD_SET(socket,&readfds);
	    FD_SET(0,&readfds);

	    if(select(socket+1,&readfds,NULL,NULL,NULL)<0 )
		  goto EXIT_CLIENT;

	     if(FD_ISSET(0,&readfds))
	     	{/* 键盘输入,发往服务器*/
	     	   if((len =read(0,key_buf,sizeof(key_buf))) >0)
	     	   	{
	     	   	    if(strcmp(key_buf,"quit") == 0)
						goto EXIT_CLIENT;
					
	     	   	    if(send(socket,key_buf,len,0) == SOCKET_ERROR)
						goto EXIT_CLIENT;
	     	   	}
	     	}
		else if(FD_ISSET(socket,&readfds))
			{/* 收到网络信息*/

			 if((len =recv(socket,recv_buf,sizeof(recv_buf),0)) >0)
			 	{			
				    recv_buf[len] = 0;
				    printf("server:%s",recv_buf);
				    if(recv_buf[len-1]!='\n')
				       printf("\n");
			 	}
			  
			   
			}
     	}

EXIT_CLIENT:
	 OS_SocketClose(socket);
	 OS_SocketClear();

}

⌨️ 快捷键说明

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