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