1

TCP/IP Socketserver をプログラミングしています。

私の問題は、(たとえば) サーバーに telnet を実行してデータを送信しないと、accept 呼び出しがブロックされ、新しい着信接続を受け入れないことです。

何かを送信するか、telnet を終了すると、accept がブロックを停止し、送信されたデータを処理して、accept を開始し、新しい着信接続を受け入れることができます。

main() {
   socket = bind_listen();

   while(1) {
       user_socket = accept(socket);
       ssl = SSL_new(ctx);
       SSL_set_fd(ssl, user_socket);
       SSL_accept(ssl);

       event.data.fd = user_socket;
       event.events = EPOLLIN | EPOLLONESHOT;

       epoll_proof = epoll_ctl(poll_fd, EPOLL_CTL_ADD, user_socket, &event);
   }
}

epoll_wait() を実行してデータを処理するスレッドがいくつかあります。何か案が?ありがとう!

4

3 に答える 3

2

これは、プログラムがシングル スレッドであるためです。最初のステップでは接続を待ち、その後、接続が確立されると入力を待ちます。
いくつかの接続を待機させ、それらすべてを受け入れるようにするためのいくつかのオプションがあります: Threading、Select、および fcntl 。

于 2012-08-27T16:31:40.463 に答える
1

まず、リッスンしているファイル記述子を ( select,pollまたはepoll/でkqueue)ポーリングし、読み取る準備ができている場合にのみ呼び出すaccept必要があります。

次に、より具体的には、エッジ トリガーepollを使用する場合は、最初にソケットを非ブロック モードに設定する必要があります。次に、読み取りの準備ができたことが通知されたら、エラーacceptが返されるまでループで呼び出す必要があります。または、一度に複数の接続要求が待機している可能性があり、エッジ トリガー ポーリングは状態の変化についてのみ警告します。そのため、ソケットを排出する必要があります。-1EAGAINEWOULDBLOCK

非常に単純な方法で、ポーリングを廃止し、ビジー ループまたは一種のスリープを伴うループのいずれかで、非ブロッキング ソケットのみを使用することもできます。しかし、それはまったく無駄であり、適切な/ソリューション(またはプラットフォームが提供するポーリングメカニズム)と比較して何も購入しません。epollkqueue

于 2012-08-27T16:44:53.720 に答える
1

select や poll ファミリなどのマルチプレクサを使用できます。

これにより、ブロックされずに受け入れをいつ実行できるかがわかります。

マルチプレクサの使い方がわからない場合は、選択が最も簡単なソリューションだと思います:http://linux.die.net/man/2/select

これにより、読み取り/書き込みがブロックされるなどの悪い状況も回避されます。

于 2012-08-27T16:29:23.493 に答える