select是一个函数,用于向OS查询。OS_socket类做了一个简单的封装,用于查询Socket是否可以读写。
实例:
Client:
#include <stdio.h>
#include <string.h>
#include "osapi/osapi.h"
#include "Endian.h"
int main()
{
// 打开Socket
OS_TcpSocket client_sock;
client_sock.Open();
// 连接服务器
OS_SockAddr serv_addr("127.0.0.1", 9555);
if( client_sock.Connect( serv_addr ) < 0)
{
printf("无法连接服务器!\n");
return -1;
}
char buf[1024];
int n;
// 发送请求
strcpy(buf, "help me");
n = strlen(buf);
client_sock.Send(buf, n);
// select
printf("wait...\n");
int ret = client_sock.Select_ForReading(6000);//大于0可以读,等于0则超时,-1则失败。
printf("ret: %d \n", ret);
// 接受应答
n = client_sock.Recv(buf, sizeof(buf));
buf[n] = 0;
printf("Got: %s \n", buf);
getchar();
// 关闭Socket
client_sock.Close();
return 0;
}
Server:
int TcpConn::Routine()
{
// 为client提供服务
unsigned char buf[1024];
int n ;
// 接收客户的请求
n = m_WorkSock.Recv(buf, 1023);
buf[n]=0;
printf("客户请求: %s \n", buf);
OS_Thread::Msleep(5000);//等待5秒,然后发送响应。
// 应答客户
m_WorkSock.Send("yes", 3);
// 关闭socket
m_WorkSock.Close();
return 0;
}
int select_ForReading(int timeout);//传递超时参数
同理:int select_ForWriting(int timeout);
能够查询那些可以读,哪些可以写。
select用途:如果服务器同时与大量客户端进行交互,可以用select查询机制查询哪些select有上来的数据,当有数据时,才做响应。这样可以避免为每个client创建线程。