2

クライアントプログラムからサーバープログラムに構造体を送信したいと思います(サーバーとクライアントプログラムの両方を作成しています)。また、重要な場合は、32ビットOS Linuxで記述しており、クライアントとサーバーの両方が同じシステムで実行されます。これが私の構造です:

struct msg_to_server {
    int type_of_msg;
    int type;
    int flag;
    int pid;
    char name[MAX_WORD];
    char client_name[MAX_WORD];
    int child_timeout;
    int numberKilled;
};

intを送信する場合、htonl(int)を使用してunsigned intをホストバイトオーダーからネットワークバイトオーダーに変換する必要があることは知っていますが、構造体の場合はどうすればよいですか?どんな助けでも大歓迎です。

4

2 に答える 2

4

同じ種類のシステムとの間で送受信していることがわかっている場合は、整数をネットワークバイトオーダーに変換する必要はありません。これは、エンディアンが異なるシステム間で送信する場合にのみ重要です。

少なくとも、変換ステップをまったく行わずに、構造全体のバイトをソケット経由で送信するだけで済みます。

// client
struct msg_to_server msg;
send(sock, &msg, sizeof(msg), 0);

// server
struct msg_to_server msg;
ssize_t n = recv(sock, &msg, sizeof(msg), 0);

ただし、TCPを使用している場合、プロトコルが要求したすべてのバイトを返すとは限らないことに注意してくださいrecv()recv()クライアントから送信されたすべてのバイトを取得するには、複数回呼び出す必要がある場合があります。UDPを使用している場合、これについて心配する必要はありませんが、信頼性の低い配信などの他の考慮事項があります。

于 2012-04-08T20:30:24.613 に答える
3

Q:intを送信する場合、htonl(int)を使用してunsigned intをホストバイトオーダーからネットワークバイトオーダーに変換する必要があることは知っていますが、構造体の場合はどうすればよいですか?

1)Greg Hewgillが正しく述べたように:

同じ種類のシステムから送受信していることがわかっている場合は、ネットワークバイトオーダーに変換する必要はありません。

2)それ以外の場合、このバイナリ構造体をリトルエンディアン以外のホストと交換する可能性があると思われる場合は、フィールドごとにhtonl/ntohlおよびhtons/ntohsを使用する必要があります。送信するときと受信するとき。

3)ただし、移植性を高める最善の方法は、ネットワーク経由でバイナリレコードを送信しないようにすることです。

それこそが、XMLやJSONなどのフォーマットが優れているところです。

そして、なぜインターネット標準(HTTPやSMTPなど)がテキストベースになる傾向があるのか​​。

可能であれば、ホスト間でテキストレコード(XMLなど)を確実に交換します。

私見では...

于 2012-04-08T20:36:59.147 に答える