0

クライアントとサーバーがあります。UDPを使用しています。(C/Unix)

サーバーには構造があります:

typedef struct Header {
int seqid;
int len;
char payload[100];
}
...
char test[100];
struct Header package;
package.seqid = 1;
package.len = 64;
strcpy(package.payload, test);
sendto(sockfd, &package, 100, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

クライアントでは、私は同じ構造を持っています:

struct Header* myrepos;
...
recvfrom(sockfd, recvline, 100, 0, NULL, NULL);
//recvline is a char[100]
...

提出された構造(サーバーによって提出された)を「myrepos」にロードしたい。どうやってやるの?

を使って

*angel = (struct Header*)&recvline;

コンパイラ エラーが発生します。

私の方法が本当に正しいのか、それとも起こる可能性があるのか​​ わかりません。他の解決策はありますか?

ありがとう!

4

3 に答える 3

1

1:sendto(sockfd, &package, sizeof(struct Header), 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));

2:recvline = new char [sizeof(struct Header)];

3:myrepos = (struct Header *)recvline;

于 2012-05-14T10:31:54.473 に答える
0

固定サイズのパッケージを送信する場合。次に、これが解決策になる可能性があります。

サーバ:

sendto(sockfd, &package, sizeof(package), 0, 
       (struct sockaddr*)&cliaddr, sizeof(cliaddr));

クライアント:

struct Header myrepos;
...
recvfrom(sockfd, &myrepos, sizeof(myrepos), 0, NULL, NULL);

当然のことながら、関数の戻りコードを確認する必要があります。

可変サイズのパッケージを送信する場合は、より複雑になります。

于 2012-05-14T11:34:49.277 に答える
0

ここでいくつかの問題を抱えていると思います。

  1. 送信するバッファのサイズを 100 と言っているのはなぜですか? 常に 100 バイトのペイロードを送信すると仮定すると、これは sizeof(struct Header) である必要があります。
  2. 整数変数を受信して​​反対側で割り当てるときに「ネットワーク順序」に変換せずにネットワーク内で整数変数をそのまま送信すると、両方のマシンのエンディアンが同じでない限り、誤った値になる可能性があります。

したがって、私の提案は、それらすべてをバッファーに変換して送信し、受信時にバッファーを構造体にデコードすることです。

送信用レコードの作成方法の例:

char sbuf[100] = {0};
char test[100] = {"Test Message"};
char *p = sbuf;
int bytestobesent = 0;

p = htonl(1);
p = p+sizeof(long);
p = htonl(64);
p = p+sizeof(long);
memcpy(p, test, strlen(test));

bytestobesent = sizeof(long) + sizeof(long) + strlen(test);

sendto(sockfd, sbuf, bytestobesent , 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr)); 

ネットワークからバッファを受信するときは、これを逆にしてください。お役に立てれば。

于 2012-05-14T10:48:12.670 に答える