私はC langによる多重化方法でチャットプログラムを開発しています。C:ソケット管理(ソケット情報は新しく接続されたソケットによって上書きされます)
私のサーバーは、clientAからclientBにプライベートメッセージを送信する必要があります。
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);
}
:
だから、あなたは簡単に想像できるように、私は新しいソケットが作成されると
typedef struct client{
char *id;
struct sockaddr_in addr;
int isAlive;}CLIENT;
が、私は以下のようにこの情報を追加した構造体CLIENTに、新たに接続されたソケットの情報を記録しましたコードの上に、現在登録されているすべてのソケットIDをチェックするコードを追加しました。クライアントAとclientBが接続されている場合
はしかし、 は何私は、サーバーからもらったことは以下の通りです:
追加クライアントID:クライアントA
TOTALクライアントID:クライアントA
追加クライアントID:clientB
合計クライアントID:clientB
合計クライアントID:clientB
ご覧のとおり、clienBの情報はclientAの情報を上書きします。
紛失しているものがありますか?
解決するために情報が不足している場合は、私は直接更新します。
はあなたがすべてのあなたのCLIENT
エントリで同じbuf
変数へのポインタを使用している
注意して、このコピーを解放する必要があります: 'BUF [str_len] = '\ 0';' stlen以来、1でオフにすることができBUF_SIZEに等しくすることができます。 – wildplasser
@wildplasserいいえ、そうではありません。 strlen(buf)はBUF_SIZEではなく、 'buf'の文字の長さです。私はすでにこれをチェックした – LKM
はいです。 read()はBUF_SIZEを返すことができるので、buf [str_len]は範囲外である可能性があります。あなたは**チェックしていませんでした。 – wildplasser