2016-08-21 5 views
2

私はかなりソケットプログラミングに新しいです、そして、私は着信TCP接続を取得し、どうにかそれらを管理するプログラムを書こうとしています。C++のpoll()関数でエラーが発生するのはなぜですか?

int main(int argc, char *argv[]) { 
char *port; 
struct pollfd connections[MAX_CONNECTIONS]; 
struct addrinfo addr_hints, *addr_result; 
int ret, i; 

for (i = 0; i < MAX_CONNECTIONS; ++i) { 
    connections[i].fd = -1; 
    connections[i].events = POLLIN; 
    connections[i].revents = 0; 
} 

port = "0"; 

memset(&addr_hints, 0, sizeof(struct addrinfo)); 
addr_hints.ai_flags = AI_PASSIVE; 
addr_hints.ai_family = AF_UNSPEC; 
addr_hints.ai_socktype = SOCK_STREAM; 
addr_hints.ai_protocol = IPPROTO_TCP; 

getaddrinfo(NULL, port, &addr_hints, &addr_result); 

connections[0].fd = socket(addr_result->ai_family, addr_result->ai_socktype, addr_result->ai_protocol); 

if (connections[0].fd < 0) { 
    cerr << "Socket error" << endl; 
    return 0; 
} 

if (bind(connections[0].fd, addr_result->ai_addr, addr_result->ai_addrlen) < 0) { 
    cerr << "Bind errror" << endl; 
    return 0; 
} 

if (listen(connections[0].fd, 25) < 0) { 
     cerr << "Listen error" << endl; 
    return 0; 
} 

do { 
    for (i = 0; i < MAX_CONNECTIONS; ++i) 
      connections[i].revents = 0; 

    ret = poll(connections, MAX_CONNECTIONS, -1); 

    if (ret < 0) { 
     cerr << "Poll error" << endl; 
     return 0; 
    } else { 
     //DO SOMETHING 
    } 

} while(true); 
} 

MAX_CONNECTIONSは、私が聞いていたに記述することになっている10000の接続[0]に設定された定数である:次のコードは、私に「ポーリング・エラー」を与えているなぜ私は把握することはできません着信接続。私はランダムなポートを選択したいので、ポートを "0"に設定します。ポーリング機能がすぐに失敗し、 "Poll error"というメッセージが生成されたようです(poll()は基本的に0未満でした)。私はチェックした後、ポーリングとバインド接続[0]の後にファイル記述子があります。私は何が間違っているのか分からない、それはgetaddrinfo関数で何か?

+4

あなたはhttp://man7.org([ 'errno']をチェックする必要があります呼び出し/linux/man-pages/man3/errno.3.html)を使用してエラーコードを取得します。たとえば、 ['strerror'](http://en.cppreference.com/w/cpp/string/byte/strerror)を使用して、エラーの印刷可能な文字列を取得します。 –

+0

私は参照してください。私はあなたが推奨した通り、それは "無効な引数"エラーです。 pollfd構造のサイズにある種の制限がありますか?私は他に何が間違っているのか分からない。 – TheMountainThatCodes

答えて

3

問題は、ファイルのディスクリプタ配列pollが大きすぎます。最大サイズはRLIMIT_NOFILEとして定義されます。これはおそらくあなたのシステムにとって1024です。 MAXIMUM_CONNECTIONSをこの値以下に減らしてください。世論調査のスペックから

EINVAL The nfds value exceeds the RLIMIT_NOFILE value. 

でより多くを参照してください:あなたはシステムからエラーを取得するとhttp://man7.org/linux/man-pages/man2/poll.2.html

関連する問題