Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为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,并且errnoWSAENOTSOCK(10038)。

现在,这里的问题是sock是一个完全有效的文件描述符。插座。 recv()send()运行正常,没有任何错误。
另一方面,文件描述符262500并不是很多。

我是正确轮询还是以某种方式无法正确投射它,因为SOCKETfd_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