ソケットに接続できるサーバー上で、マネージャークライアントの単純な CRUD を作成しようとしています (C では、あまり慣れていない言語ですが、選択の余地はありません)。サーバーは、セッション ID を使用して、同時に 10 の同時接続を保持します。問題は、10 個のクライアントを追加した後にリストを印刷すると、10 回の同じオブジェクト (または同じ ID を持つ 10 個のオブジェクト、これは私が少し混乱している場所です) のリストが表示されることです。
これは、マネージャー クライアントの構造体を宣言し、リスト (10 個を保持できる) を宣言する方法です。
typedef struct Mana_client {
int client_id;
int timestamp_connection;
char privilege_level;
}Mana_client;
Mana_client *mana_client_list[10];
srand(time(NULL)); // is called once when initializing the thread.
これは、「クライアントをリストに追加する」と書いた方法です。
int add_mana_client()
{
int i=0;
int client_id = 0;
int timestamp = 0;
Mana_client client = { client_id, timestamp, 1};
client_id = rand()%100000;
timestamp = time(NULL);
client.client_id = &client_id;
client.timestamp_connection = ×tamp;
for(i=0; i <10; i++)
{
if(mana_client_list[i] == NULL){
printf("%u. Empty spot in list\n", i);
if(!contains_mana_client_id(client_id)){
printf("%u. Adding client... (with ID%u)\n", i, client.client_id);
mana_client_list[i] = &client;
return client_id;
}
}
}
return 0;
}
これは、同じ ID を持つクライアントが既にリストにあるかどうかを確認する方法です。
int contains_mana_client_id(int id)
{
int i=0;
for(i=0; i <10; i++)
{
if(mana_client_list[i] != NULL){
if(id == mana_client_list[i]->client_id){
printf("%u. Client with ID=%u found.\n", i, id);
return 1;
}
}
}
return 0;
}
次に、リストとそのクライアントを確認します。
void print_mana_client_list()
{
int i=0;
printf("Printing list of mana clients...\n\n");
for(i=0; i <10; i++)
{
if(mana_client_list[i] != NULL){
printf("%u. Client with ID=%u.\n", i, mana_client_list[i]->client_id);
}else{
printf("%u. Empty.\n", i);
}
}
}
クライアントを追加するメソッドを 12 回連続して実行し、リストを出力すると、次の出力が得られます。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=41)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=18467)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=6334)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=26500)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=19169)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=15724)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=11478)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=29358)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=26962)。
- リストの空のスポット
- クライアントを追加しています... (ID94630956) 管理クライアントが追加されました (ID=24464)。
管理クライアントが追加されました (ID=0)。
管理クライアントが追加されました (ID=0)。
mana クライアントのリストを印刷しています...
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
- ID=3435973836 のクライアント。
個人的には、問題はオブジェクト/値を保存または渡す方法に関連していると思いますが、完全にはわかりません。これに関する助けをいただければ幸いです。