0

udp ソケットを介して 2 台のマシン間で構造体を送信する必要があります。必要な情報は、次のように構造体を送信することです。

unsigned long x;

unsigned long y;

char *buf;

構造体を一度に送信する必要があります。

私の問題は次のとおりです。たとえば、特に変数 buf のサイズが固定されていないため、ソケットを介して送信できる1つの変数に設定するために、この構造をどのように処理できますか?

ご協力ありがとうございました

4

2 に答える 2

2

ポインターを送信することはできません。プロセス空間の外では意味がありません。代わりに、シリアル化する必要があります。つまり、配列にコピーして送信する必要があります。文字列の前に、その長さも格納する必要があります。あなたが試すことができます:

char sendbuf[...];
int len = strlen(buf);

memcpy(sendbuf, &x, sizeof(x));
memcpy(sendbuf + sizeof(x), &y, sizeof(y));
memcpy(sendbuf + ..., &len, sizeof(len));

memcpy(sendbuf + ..., buf, len);
于 2012-07-05T09:39:22.300 に答える
1

構造体内のすべてを順番に別の char バッファーにコピーし、それをソケットに書き込む必要があります。オプションで、構造体内の char* バッファーは固定長ではないため、送信するサイズを計算し、これをメッセージの最初に整数として書き込むことをお勧めします。送信するパケットの長さは、受信ソケットで確認できます。

反対側でデータをアンパックするときは、受信バッファーの先頭から始めて、memcpy データを値に入れます。

char* メッセージ; // これは、受信したメッセージ バッファの // 先頭へのポインタです

// TODO: assign message to point at start of your received buffer.


unsigned long xx;
unsigned long yy;
memcpy(&xx,message,sizeof(unsigned long));  // copy bytes of message to xx
message += sizeof(unsigned long);           // move pointer to where yy SHOULD BE 
                                            // within your packet    
memcpy(&yy,nessage,sizeof(unsigned long));  // copy bytes to yy
message += sizeof(unsigned long);           // message now points to start of 
                                            // the string part of your message

int iStringLength =   //  ?????? You need to calculate length of the string
char tempBuffer[1000]; // create a temp buffer this is just for illustration
                       // as 1000 may not be large enough - depends on how long
                       // the string is
memcpy(tempBuffer,message,iStringLength);

次に、xx、yy には長い値が含まれ、tempBuffer には文字列が含まれます。文字列を現在のスコープを超えて保持する場合は、メモリを割り当ててそこにコピーする必要があります。この文字列のサイズは、メッセージ全体のサイズから 2 つの署名されていない長いアイテムのサイズを引いたものから計算できます (または、上記で提案したようにした場合は、パケットで送信された余分なアイテムを使用します)。

これにより、何をする必要があるかが明確になることを願っています

于 2012-07-05T09:46:07.633 に答える