簡體   English   中英

C:套接字管理(套接字信息被新連接的套接字覆蓋)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM