当数据准备就绪时,poll(2)不会返回

时间:2013-08-25 22:44:24

标签: c++ sockets

我试图用C ++编写套接字抽象。我正在使用poll()系统调用来等待数据准备好读取。但是,当我运行我的程序时,如果我将它设置为无限轮询,则poll()永远不会返回,即使我发送了套接字数据。

这是一个简单的程序来说明我的问题。我在OSX上用这一行编译它:clang++ -g -Wall -pedantic -std=c++0x -stdlib=libc++ pollTest.cpp -o pollTest。我正在使用nc程序为要连接的程序设置监听套接字。当我运行它时,poll()调用永远挂起,由于数据准备好读取而永远不会返回。

#include <poll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <unistd.h>
#include <poll.h>
#include <fcntl.h>
#include <cstdlib>
#include <iostream>

void connectSocket(int& fd, std::string hostname, std::string service) {
  struct addrinfo hints, *res, *res0;
  int error;
  int s;
  memset(&hints, 0, sizeof(hints));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  error = getaddrinfo(hostname.c_str(), service.c_str(), &hints, &res0);
  if (error) {
    throw error;
  }
  s = -1;
  for (res = res0; res; res = res->ai_next) {
    s = socket(res->ai_family, res->ai_socktype,
                res->ai_protocol);
    if (s < 0) {
      continue;
    }

    if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
      close(s);
      s = -1;
      continue;
    }

    break;  /* okay we got one */
  }

  if (s < 0) {
    throw s;
  }
}

int main() {
  int socketFileDescriptor = -1;
    connectSocket(socketFileDescriptor, "localhost", "9999");

  pollfd socketPolls[1];
  socketPolls[0].fd = socketFileDescriptor;
  socketPolls[0].events = POLLIN | POLLPRI | POLLRDBAND | POLLRDNORM;
  poll(socketPolls, 1, -1);
  std::cerr << socketPolls[0].revents;
}

有关为何发生这种情况的任何想法?我觉得好像我已经很好地阅读了文档,并且正确地使用了系统调用。 (我没有在这个示例程序中进行错误检查,但我在我的项目中做了)。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:4)

connectSocket中,您从未将fd设置为任何内容,因此在main中,socketFileDescriptor仍为-1poll将无法找到套接字上的任何数据。您可能想要统一sfd。也就是说,我认为你最好不要使用引用来返回文件描述符。