网络与线程编程(第八节:查询机制)

博客介绍了如何利用select函数进行网络查询,OS_socket类进行了封装,方便查询Socket的读写状态。通过示例展示了如何调用select_ForReading和select_ForWriting函数进行超时设置。该机制在处理大量客户端连接时,能有效避免为每个客户端创建线程,提高服务器效率。
摘要由CSDN通过智能技术生成

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创建线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值