美文网首页
Windows 的 select() 用法

Windows 的 select() 用法

作者: 客昂康 | 来源:发表于2021-04-23 10:35 被阅读0次

Windows 的 select() 与 Linux 的 select() 用法类似,但 Windows 的 select() 仅用于 socket。

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int WSAAPI select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const timeval *timeout);
// nfds:      忽略,设置为0即可,该参数只是为了与Berkeley sockets兼容。
// readfds:   要检查可读性的socket的集合。
// writefds:  要检查可写性的socket的集合。
// exceptfds: 要检查出错的socket的集合。
// timeout:   最大等待时间,设置为NULL表示永远等待。

// 这些宏用于设置 fd_set  集合:
FD_ZERO  (   *set);  // 清空 fd_set 集合中所有套接字。
FD_CLR   (s, *set);  // 删除 fd_set 集合中的套接字 s。
FD_ISSET (s, *set);  // 判断套接字 s 是否在 fd_set 集合中。
FD_SET   (s, *set);  // 向 fd_set 集合添加套接字 s。

用法举例:

// 对两个socket进行桥接
static void socketBridge(int socket1, int socket2){
    char buffer[1024];
    fd_set readfds;
    struct timeval tv;
    int selectError;
    int recvSize;
    for(;;){
        // 将 socket1 和 socket2 添加到 readfds
        FD_ZERO(&readfds);
        FD_SET(socket1, &readfds);
        FD_SET(socket2, &readfds);
        
        // 等待 socket1 或 socket2 可读
        tv.tv_sec = 60;
        tv.tv_usec = 0;
        selectError = select(0, &readfds, NULL, NULL, &tv);
        if(selectError < 0) break;
        if(selectError > 0){
            
            // 如果 socket1 可读,读取并转发给 socket2。
            if(FD_ISSET(socket1, &readfds)){
                recvSize = recv(socket1, buffer, 1024, 0);
                if(recvSize <= 0) break;
                send(socket2, buffer, recvSize, 0);
            }
            
            // 如果 socket2 可读,读取并转发给 socket1。
            if(FD_ISSET(socket2, &readfds)){
                recvSize = recv(socket2, buffer, 1024, 0);
                if(recvSize <= 0) break;
                send(socket1, buffer, recvSize, 0);
            }
        }
    }
}

相关文章

  • Windows 的 select() 用法

    Windows 的 select() 与 Linux 的 select() 用法类似,但 Windows 的 se...

  • 温故知新-MYSQL-语法

    查询数据 SELECT SELECT DISTINCT 去重查询 基础用法: SELECT DISTINCT la...

  • Mysql性能分析及explain用法

    explain用法 EXPLAIN [EXTENDED] SELECT select_options 例如: 相关...

  • MyBatis XML使用方式

    内容: select用法 insert用法 update用法 delete用法 多个接口参数的用法 动态代理实现原...

  • select 模型

    问题: select是什么?什么是select? select?用于解决什么问题? select的用法? 采用se...

  • DQL

    DQL:Data QueryLanguage 数据查询语言 select具体用法 SELECT select_li...

  • select用法

    golang 的 select 的功能和select, poll, epoll相似, 就是监听 IO 操作,当 I...

  • Windows Select

    select IO模型学习 问题由来单进程单线程下,最普通的socket是阻塞连接的,即server与一个clie...

  • sql笔记

    select系列 1、where用法示例: SELECT * FROM Websites WHERE countr...

  • go select + channel 常见用法

    for-select for-select 是一个很常见的用法,select 语句可以从多个可读的 channel...

网友评论

      本文标题:Windows 的 select() 用法

      本文链接:https://www.haomeiwen.com/subject/hdzqrltx.html