2

これは、ユーザーに文字列を入力してサーバーに送信するように求めるクライアント側です。

//send
printf("\nPlaintext : ");
gets(send_data);
send(sock,send_data,strlen(send_data), 0);

//recv
bytes_recieved = recv(sock, recv_data, 1024, 0);
recv_data[bytes_recieved] = '\0';
printf("\nEnciphered text = %s " , recv_data);
fflush(stdout);
close(sock);

そしてこれがサーバー側です。

sin_size = sizeof(struct sockaddr_in);

//accept
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

printf("\n I got a connection from (%s , %d)", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

//recv
bytes_recieved = recv(connected, recv_data, 1024,0);

recv_data[bytes_recieved] = '\0';

printf("\n RECIEVED DATA = %s " , recv_data);

cod = encipher(recv_data, key, 1); //printf("Code: %s\n", cod);
dec = encipher(cod, key, 0); //printf("Back: %s\n", dec);

//send
send(connected, cod, strlen(cod), 0);
send(connected, dec, strlen(dec), 0);

つまり、クライアントから 'plaintext' と 'key' という名前の 2 つの文字列を送信したいということです。サーバー側では、2 つの文字列を受け取り、encipher() 関数で処理してから、クライアントに送り返すことを期待していました。

クライアントから 2 つの文字列を送信し、サーバーから 2 つの文字列を受信するにはどうすればよいですか?

4

2 に答える 2

1

最初に文字列を送信してから、サーバーがそれを受信したという確認をクライアントに書き戻すようにします。その後、クライアントはキーを送信でき、サーバーは必要なことを実行してクライアントにメッセージを返すことができます。send()ソケット接続を開いたままにしておくと、接続の両端との間で情報を送受信し続けることができます。recv(). 文字列の構造に応じて、いくつかの方法があります。サーバーに送信するデータに区切り文字を使用して文字列の末尾を示すことができます。これにより、残りの部分がキーになります。これにより、サーバーは 1 つのパケットでデータを受信し、1 つのパケットで応答できます。それを行う正しい方法があるかどうかはわかりません。アプリケーションのニーズに基づいて決定する必要があります。いずれにせよ、ソケット関数の戻り値をチェックして、自分が思っているものを取得および送信していることを確認する必要があります。

于 2012-06-13T17:04:47.100 に答える
0

1 番目の文字列のサイズを含む 16 ビットの short を送信し、次に 1 番目の文字列を送信し、次に 2 番目の文字列のサイズを含む別の short を送信し、次に 2 番目の文字列を送信します。サーバーで、16 ビットの int を読み取り、そのバイト数を読み取り、2 番目の文字列に対して同じことを行います。

于 2012-06-13T17:08:46.733 に答える