Closed. This question needs debugging details。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
去年关闭。
Improve this question
以下是使用WSAPoll所需的最少代码,其中不包括初始化(
运行它,值将按行更改,如下所示:
如果我没看错,
现在,这里的问题是
另一方面,文件描述符
我是正确轮询还是以某种方式无法正确投射它,因为
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
去年关闭。
Improve this question
以下是使用WSAPoll所需的最少代码,其中不包括初始化(
socket()
,bind()
,listen()
,accept()
等)或之前的任何条件。您可以使用文档中的sample server code,并且sock
将以ClientSocket
为基础。运行它,值将按行更改,如下所示:
// ...
// socket(), bind(), listen(), etc.
// sock = accept(...)
// See boilerplate linked.
SOCKET sock; // sock = 356
FDSET set; // Some garbled data, though should be same as below:
FD_ZERO(&set); // fd_count = 0, fd_array = [14757395258967641292, x64]
FD_SET(sock, &set); // fd_count = 1, fd_array = [356, 14757395258967641292 x63]
int iResult = WSAPoll(&set, 1, 1) // iResult = -1
// fd_count = 1, fd_array = [262500, 14757395258967641292 x63]
int errid = WSAGetLastError(); // errid = WSAENOTSOCK (10038)
// if (iResult > 0)
// recv(), etc.
如果我没看错,
WSAPoll()
应该模拟 poll()
。因此,当我将sock
存储到set
时,它会正确存储它,但是当将其传递到WSAPoll()
中时,值会更改并返回-1,并且errno
为WSAENOTSOCK
(10038)。现在,这里的问题是
sock
是一个完全有效的文件描述符。插座。 recv()
和send()
运行正常,没有任何错误。另一方面,文件描述符
262500
并不是很多。我是正确轮询还是以某种方式无法正确投射它,因为
SOCKET
和fd_array
只是unsigned __int64
的一个/单数/数组,因此看起来好像不需要投射。 最佳答案
您将参数混合到select()
和poll()/WSAPoll()
。
它是select()
,需要FDSET
作为参数。 poll()/WSApoll()
将pollfd
数组作为参数。
对于WSAPOLLFD
参数的描述,所引用的Microsoft文档中的超链接似乎符合404。也许您可以在其他地方找到它,或者使用Linux版本的文档(Google关键字:struct pollfd
)。
您的编译器很可能还对您大喊大叫警告消息和其他ob亵内容;因为WSAPoll
的第一个参数的类型显然是错误的指针类型。如果是这样,这是一个很好的教训,即使它仍在编译程序,也不要忽略来自C++编译器的警告消息。
10-08 14:34