我正在尝试在可以与套接字连接的服务器上创建一个简单的管理器客户端 CRUD(用 C 语言,一种我不太熟悉但我别无选择的语言)。通过使用会话 ID,服务器将同时保持 10 个同时连接。问题是,当我在添加 10 个客户端后打印列表时,它会显示一个包含 10 次相同对象的列表(或 10 个具有相同 ID 的对象,这让我有点困惑)。
这就是我声明经理客户端的结构并声明列表(可以容纳其中的 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 的客户端。
我个人认为问题与我存储或传递对象/值的方式有关,但我并不完全确定。对此的任何帮助将不胜感激。