C:套接字管理(套接字信息被新连接的套接字覆盖)

时间:2016-05-14 10:26:20

标签: c sockets

我正在使用C lang的多路复用方式开发一个聊天程序。

我的服务器需要从clientA向clientB发送私信。

因此,您可以轻松想象,我在struct CLIENT

中记录了新连接套接字的信息
typedef struct client{
char *id;
struct sockaddr_in addr;
int isAlive;}CLIENT;

创建新套接字时,我添加了以下信息:

adr_sz = sizeof(clnt_adr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &adr_sz);
int newlyAddedConnectedSocket = clnt_sock;
FD_SET(clnt_sock, &reads);
if (fd_max < clnt_sock) {
   fd_max = clnt_sock;
}
printf("newly created connected socket : %d\n",clnt_sock);
str_len = read(clnt_sock, buf, BUF_SIZE);
char idBuf[BUF_SIZE];
buf[str_len] = '\0';

CLIENT newClient;
newClient.id = buf;
newClient.addr = clnt_adr;
newClient.isAlive = TRUE;
clients[clnt_sock] = newClient;
printf("added client id : %s\n",clients[newlyAddedConnectedSocket].id);
for (int k = serv_sock+1; k < fd_max+1; k++) {
  printf("TOTAL CLIENT ID : %s\n",clients[k].id);
}

在代码上方,我添加了一些代码来检查当前注册的所有套接字ID。

但是当clientA和clientB连接时, 我从服务器得到的是:

  

添加了客户端ID:clientA

     

总客户ID:clientA

     

添加了客户端ID:clientB

     

总客户ID:clientB

     

总客户ID:clientB

如您所见,clienB的信息会覆盖clientA的信息。

我有什么遗失的吗?

如果信息短缺需要解决,我会直接更新。

谢谢

1 个答案:

答案 0 :(得分:1)

您在所有buf条目中使用指向同一CLIENT变量的指针。每次接受新连接时都会被覆盖。您需要为每个客户制作一份副本。

newClient.id = strdup(buf);

当客户端断开连接时,您需要使用

释放此副本
free(client[clientDisconnecting].id);