私は C++ クラスの基本的なネットワーク プログラミング セットを作成しました (tcp_socket、udp_socket、および ip_address ラップ クラス クラスにすぎません)。I/O 多重化サーバーで問題が発生しています。説明させてください:
シナリオは次のような方法です。
class base_socket
{
//code for all sockets methods (both tcp and udp this class throws
//errors and derived classes will cathc them.
~base_socket() { ::close(sock_fd); }
};
class udp_socket : public base_socket
{
//code for the udp_socket
virtual ~udp_socket();
};
class tcp_socket : public base_socket
{
//code for the tcp_socket
virtual ~tcp_socket();
};
このスキームの上に、アプリケーションのコンテキストに応じて、下層レベルの抽象化を追加しました: 次のようなものです。
class client_t : public tcp_socket
{
//code for dependent client tasks
};
メインプログラムコードはこのようなものです
int main(int argc , char *[] argv)
{
int maxfd;
fd_set rset;
std::vector<base_socket> clientsV;
while(1)
{
FD_ZERO( &rset);
FD_SET( {/*listening socket fd*/, &rset);
if( clientsV.size() > 0)
maxfd = // socket fd with max value between sockets
else
maxfd = //listen socket
for (auto it = clientsV.begin() ; it != clientsV.end(); ++it)
FD_SET( /*client's socket fd*/, &rset);
select( maxfd+1, &rset, NULL, NULL, NULL) < 0);
if( FD_ISSET( /*listeing_socket*/, &rset))
{
client_t * newclient = new client_t();
listening_socket.accept(newclient);
newClient->send_message("HELO");
clientsV.push_back(*newClient);
}
}
}
これは最初のクライアントでは機能しますが、2 番目のクライアントが来ると HELO 応答を受け取りますが、2 番目のクライアントでは V.push_back(*newClient) で最初の接続が閉じられます()。何がうまくいかないのですか?