[英]C : socket management (socket information is overwritten by newly connected socket)
我正在用C lang的复用方式开发一个Chatting程序。
我的服务器需要从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
客户端总数:clientA
添加的客户端ID:clientB
客户端总数:clientB
客户端总数:clientB
如您所见,clienB的信息将覆盖clientA的信息。
我有什么想念的吗?
如果信息不足以解决,我将直接更新。
谢谢
您在所有CLIENT
条目中都使用了指向同一buf
变量的指针。 每次您接受新连接时,此设置都会被覆盖。 您需要为每个客户制作一份副本。
newClient.id = strdup(buf);
当客户端断开连接时,您需要使用以下命令释放此副本:
free(client[clientDisconnecting].id);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.