0

シンプルな DHCP クライアントを作成しようとしています。メッセージをDHCPサーバーに送信する必要があります(すでにこれがあります)。メッセージを受信して​​解析します。構造体を作成しました

struct dhcp_msg{
 _int8 op;  //opcode
 _int8 htype; //hardware type
 _int8 haddr; //hardware adress
 _int8 hops;  //hop count

 _int32 tid;  //transaction id

 _int16 sec;  //seconds
 _int16 unused; //unused

 _int32 cipaddr;  //client ip
 _int32 yipaddr;  //your ip
 _int32 sipaddr;  //server ip
 _int32 gipaddr;  //gateway ip

 char chaddr[16]; //client hardware address
 char sname[64];  //server name
 char bname[128]; //boot file name

 _int8 mcookie[4];  //magic cookie
};

すべてのフィールドに適切なデータを入力した場合、sendto() でこれを送信するにはどうすればよいですか? sendto() が 2 番目のパラメーターとしてポインターを必要とするため、それを char に解析してポインターを送信する必要があります。

char *buffer;
...?
sendto(socketC, buffer, sizeof(buffer), 0, (SOCKADDR *)&servAddr, sizeof(sockaddr_in));

このメッセージの送信方法

4

4 に答える 4

4

まず第一に、構造体にパディングを追加しないようにコンパイラーに伝える必要があります。そして、次のことができます。

struct dhcp_msg my_msg;
// Fill my_msg
sendto(socket, (void *) &my_msg, ...)

アップデート

sendtoこの回答へのコメントでわかったように、Linux と Windows では機能が少し異なります。したがって、Linux と Windows ではそれぞれ変換を使用する必要が(void *)あります。(char *)

エンディアンについて: エンディアンにも注意する必要があります。ただし、すべての x86 CPU で正常に分岐するはずです。私がこれまでに使用した唯一の「間違った」エンディアン スタイルのシステムは、IBM Power6 ベースのスーパー コンピューターでした。

于 2011-01-15T16:18:52.230 に答える
1

バッファのアドレスを に渡すだけですsendto。それがどのようなタイプであっても、本当に重要なのsendtoはそこにあるバイトです。

struct dhcp_msg msg;
// fill in all fields...
sendto(socketC, &msg, sizeof(struct dhcp_msg), ...);

メッセージの長さは ですsizeof(struct dhcp_msg)

また、コンパイラが構造体にパディング バイトを追加する可能性があることを忘れないでください。そのため、サイズが予想よりも大きくなる可能性があります。

于 2011-01-15T16:19:14.410 に答える
0

他の人は掘り下げるのが難しいコメントが多すぎるので、新しい答えを始めましょう。

OPが実際に抱えている問題は、ポインター型変換エラーです。MSVCは引数struct dhcp_msg*として渡すことを拒否し、明示的な変換は役に立ちません。const char*

#include <sys/socket.h>

struct test {
    int a;
    int b;
};

int main() {
    struct test t;
    t.a = 3;
    t.b = 5;
    send(1, &t, sizeof(struct test), 0);

    return 0;
}

このソースは実行することを目的としていませんが、私のGCC 4.4.5(および型キャストバリアント)で正常にコンパイルされます。void*char*

さて、型キャストを注意深く行うことで問題は解決しました。

于 2011-01-15T16:55:22.957 に答える
-2

構造体 dhcp_msg を char* にキャストします

于 2011-01-15T16:19:44.973 に答える