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;
}
なぜこれが起こっているのかについてのアイデアはありますか? ドキュメントをよく読み、システム コールを正しく使用しているかのように感じます。(このサンプル プログラムではエラー チェックを行いませんでしたが、私のプロジェクトでは行います)。どんな助けでも大歓迎です!