2016-05-14 11 views
0

私は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変数へのポインタを使用している

+0

注意して、このコピーを解放する必要があります: 'BUF [str_len] = '\ 0';' stlen以来、1でオフにすることができBUF_SIZEに等しくすることができます。 – wildplasser

+0

@wildplasserいいえ、そうではありません。 strlen(buf)はBUF_SIZEではなく、 'buf'の文字の長さです。私はすでにこれをチェックした – LKM

+0

はいです。 read()はBUF_SIZEを返すことができるので、buf [str_len]は範囲外である可能性があります。あなたは**チェックしていませんでした。 – wildplasser

答えて

1

ありがとうございます。これは、新しい接続を受け入れるたびに上書きされます。クライアントごとにそのコピーを作成する必要があります。

newClient.id = strdup(buf); 

そして、クライアントの切断時、あなたは

free(client[clientDisconnecting].id); 
+0

ありがとう、私は問題を解決しました。しかし、私は 'read()'が呼ばれた後、bufを変更しなければならないと思います。なぜそれが起こっているのですか? – LKM

+0

'read()'を呼び出すたびに、同じバッファを上書きします。そして、すべてのクライアントはそのバッファへのポインタを持っています。 'newClient.id = buf'は単にアドレスを割り当てますが、バッファのコピーは作成しません。 – Barmar

関連する問題