1

C++ コースの最終プロジェクトとして小さなクライアント/サーバー プロジェクトを行っています。(sys/socket.h を使用して) 通信を処理するいくつかのクラスが渡され、基本的connection->send(byte)に 1 バイトのデータを送信することができます。

送信したい文字列があるとします。クライアントからサーバーに、またはその逆に送信されるときに、'a' が 'a' として解釈されるようにするにはどうすればよいですか? 標準では、char が unsigned または signed にデフォルト設定されていることについて何も言っていないので、それを処理する方法がわかりません。

std::numeric_limits<char>::min()両端で減算できるという考えはありましたが、それが良いものかどうかはわかりません.

4

3 に答える 3

5

TCP も UDP も、文字列のエンコーディングを気にしません。常にバイトの配列として解釈されます。したがって、文字列が正しく解釈されるようにするには、サーバーとクライアントの両方が共通のエンコーディングに同意する必要があります。

あなたの場合、文字列を送信し、受信したデータを(ASCII文字列の場合)c_str()として解釈することにより、文字列を割り当てるための std::string のメソッドを使用するだけです。const char*これは、クライアント アプリとサーバー アプリが同じ文字列ライブラリを使用している限り機能します。

于 2013-03-22T10:41:23.077 に答える
1

通信を確認するには、ネットワーク スニファーを使用する必要があります。Wiresharkは良いものです。

スニファがイーサネット パケットをキャプチャし、「a」が含まれていると判断した場合は、「a」を送信したことを確信できます。

私の経験では、それに似た文字列を送信すると:

string myString = "Hello World";

mySocket.send(myString.c_str(), myString.length());

(char*) または (unsigned char*) を使用して myString.c_str() をキャストしても、結果は同じです。

バイトは常に8ビットです:)

よろしく

于 2013-03-22T10:47:19.560 に答える
0

他の注意が必要なのは、CPU のエンディアンであり、1 バイトより大きい型が問題になる可能性があります。ビッグ エンディアンが最も一般的なネットワーク プロトコルの標準であるため、標準としてビッグ エンディアンを採用するようにしてください。

よろしくお願いします。

于 2013-03-22T15:40:15.903 に答える