Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Winsock2 select():在同一个套接字上可能有多个事件?_C++_Sockets_Select_Winsock2 - Fatal编程技术网

C++ Winsock2 select():在同一个套接字上可能有多个事件?

C++ Winsock2 select():在同一个套接字上可能有多个事件?,c++,sockets,select,winsock2,C++,Sockets,Select,Winsock2,根据: select函数返回所需的套接字句柄总数 已准备好并包含在fd_集合结构中 如果我只向每个FD_集合添加一个相同的套接字并将它们传递给select,那么返回值是否可能大于1?这意味着我必须在同一个套接字上处理多个事件。例如: SOCKET someRandomSocket; FD_SET readfds; FD_SET writefds; FD_SET exceptfds; timeval timeout; /* ... Connecting someRandomSocket to

根据:

select函数返回所需的套接字句柄总数 已准备好并包含在fd_集合结构中

如果我只向每个FD_集合添加一个相同的套接字并将它们传递给select,那么返回值是否可能大于1?这意味着我必须在同一个套接字上处理多个事件。例如:

SOCKET someRandomSocket;

FD_SET readfds;
FD_SET writefds;
FD_SET exceptfds;

timeval timeout;
/* ...
Connecting someRandomSocket to another peer.
... */

FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);

FD_SET(someRandomSocket, &readfds);
FD_SET(someRandomSocket, &writefds);
FD_SET(someRandomSocket, &exceptfds);

int total = select(0, &readfds, &writefds, &exceptfds, &timeout);

/* total > 1 is possible? */
/* (FD_ISSET(someRandomSocket, &exceptfds) && (FD_ISSET(someRandomSocket, &readfds) || FD_ISSET(someRandomSocket, &writefds)) == true) possible? */
还有一个问题:我是否可能同时处理同一套接字上的异常和非异常事件

如果我只向每个FD_集合添加一个相同的套接字并将它们传递给select,那么返回值是否可能大于1?这意味着我必须在同一个套接字上处理多个事件

无论select是否在返回值中多次计数同一套接字(这很容易测试),您都应该忽略实际数字。大于0的返回值只会告诉您,任何fd_集都包含与请求的事件匹配的套接字。选择会修改fd_集以删除不匹配的套接字。即使您知道套接字的总数,也必须使用FD_ISSET检查各个套接字,因此返回值大于0时的实际数目在实际处理中不是很有意义。只有-1错误、0超时和>0事件存在才有意义

是的,一个套接字可以同时启用多个事件。例如,套接字可以同时可读写

例如:

FD_SET readfds;
FD_SET writefds;
FD_SET exceptfds;

FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);

FD_SET(someRandomSocket, &readfds);
FD_SET(someRandomSocket, &writefds);
FD_SET(someRandomSocket, &exceptfds);

timeval timeout;
timeout.tv_sec = ...;
timeout.tv_usec = ...;

int total = select(0, &readfds, &writefds, &exceptfds, &timeout);

if (total == -1)
{
    // error in select() itself, handle as needed...
}
else if (total == 0)
{
    // timeout, handle as needed...
}
else
{
    if (FD_ISSET(someRandomSocket, &exceptfds) )
    {
        // socket has inbound OOB data, or non-blocking connect() has failed, or some other socket error, handle as needed...
    }

    if (FD_ISSET(someRandomSocket, &readfds) )
    {
        // socket has inbound data, or has disconnected gracefully, handle as needed...
    }

    if (FD_ISSET(someRandomSocket, &writefds) )
    {
        // socket is writable, or non-blocking connect() has succeeded, handle as needed...
    }
}
我是否可能同时处理同一套接字上的异常和非异常事件

这取决于例外的性质。并非所有异常都是致命错误

如果我只向每个FD_集合添加一个相同的套接字并将它们传递给select,那么返回值是否可能大于1?这意味着我必须在同一个套接字上处理多个事件

无论select是否在返回值中多次计数同一套接字(这很容易测试),您都应该忽略实际数字。大于0的返回值只会告诉您,任何fd_集都包含与请求的事件匹配的套接字。选择会修改fd_集以删除不匹配的套接字。即使您知道套接字的总数,也必须使用FD_ISSET检查各个套接字,因此返回值大于0时的实际数目在实际处理中不是很有意义。只有-1错误、0超时和>0事件存在才有意义

是的,一个套接字可以同时启用多个事件。例如,套接字可以同时可读写

例如:

FD_SET readfds;
FD_SET writefds;
FD_SET exceptfds;

FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);

FD_SET(someRandomSocket, &readfds);
FD_SET(someRandomSocket, &writefds);
FD_SET(someRandomSocket, &exceptfds);

timeval timeout;
timeout.tv_sec = ...;
timeout.tv_usec = ...;

int total = select(0, &readfds, &writefds, &exceptfds, &timeout);

if (total == -1)
{
    // error in select() itself, handle as needed...
}
else if (total == 0)
{
    // timeout, handle as needed...
}
else
{
    if (FD_ISSET(someRandomSocket, &exceptfds) )
    {
        // socket has inbound OOB data, or non-blocking connect() has failed, or some other socket error, handle as needed...
    }

    if (FD_ISSET(someRandomSocket, &readfds) )
    {
        // socket has inbound data, or has disconnected gracefully, handle as needed...
    }

    if (FD_ISSET(someRandomSocket, &writefds) )
    {
        // socket is writable, or non-blocking connect() has succeeded, handle as needed...
    }
}
我是否可能同时处理同一套接字上的异常和非异常事件


这取决于例外的性质。并非所有异常都是致命错误

你为什么不直接测试一下呢?@SergeyA-如果我测试一下,得到总数,有一个简单的测试方法。只需获得可以写入和读取的相同套接字,然后将其放入select。看看你有什么。你为什么不测试一下呢?@SergeyA-如果我测试一下,得到总数,有一个简单的测试方法。只需获得可以写入和读取的相同套接字,然后将其放入select。看看你有什么,谢谢!我不知道只有值>0才有意义。最后一个问题:我见过很多次,但不知道优雅的断开连接到底意味着什么。这是否意味着另一个对等方在其套接字上称为closesocket?这意味着该对等方发送一个FIN数据包,以表示它将不再发送任何数据。如果还没有调用shutdown,则该数据包由发送。有关更多详细信息,请参阅MSDN。谢谢!我不知道只有值>0才有意义。最后一个问题:我见过很多次,但不知道优雅的断开连接到底意味着什么。这是否意味着另一个对等方在其套接字上称为closesocket?这意味着该对等方发送一个FIN数据包,以表示它将不再发送任何数据。如果还没有调用shutdown,则该数据包由发送。有关更多详细信息,请参阅MSDN上的。