アクティブな接続を 1 つだけ受け入れる標準 (socket.h) ライブラリを使用して、サーバー C++ サーバー プログラム (Linux で) を実装したいと考えています。これを実装する方法についての私の理解は次のとおりです(エラーチェックを削除しました):
int port = 4711;
int MAXCONNECTIONS = 5;
int m_sock;
m_sock = socket ( AF_INET, SOCK_STREAM, 0 );
int on = 1;
setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof ( on ) ) < 0
sockaddr_in m_addr;
m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = INADDR_ANY;
m_addr.sin_port = htons ( port );
bind ( m_sock, ( struct sockaddr * ) &m_addr,
sizeof ( m_addr ) );
listen ( m_sock, MAXCONNECTIONS );
// now accept new connection and get socket
int con_sock;
int addr_length = sizeof ( m_addr );
con_sock = accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );
これは私のコードでこれまでのところ機能します。ただし、作成された最初のソケットは引き続き接続を受け入れます。私が理解している限り、最初のソケットを閉じる必要があります。
close ( m_sock );
これにより、新しい接続が妨げられます。しかし、最初の接続が切断されたときに、接続を再確立することができません。私の理解では、上記と同じ手順を繰り返さなければなりません。
私が遭遇したのは、ブロックして接続を待機するところを受け入れるまでコードが正常に実行されますが、接続しているクライアントは「接続が拒否されました」を受け取り、netstat に LISTEN ポートが表示されないことです。
あなたはなにか考えはありますか?
他の接続を受け入れてすぐに閉じるオプションは、ここでは考慮されません。