0

C でいくつかのソケット関数を作成していますが、この問題が発生します。私は3つのフィールドを持つ構造体を持っています:

typedef struct {
  char type;           
  unsigned int length; 
  char *buffer;        
} message_t;

同じ文字列 (型、長さ、バッファ) でラップし、ソケットにアトミックに書き込む必要があります。その後、 read 関数を使用してメッセージを読み取り、3 つのフィールドを同じ構造体に挿入する必要があります。int を固定長文字列に変換する方法がわかりません。

4

2 に答える 2

1

これはアイデアです。テストはしていませんが、非常によく似たものを使用しています。

最初に、両側で構造体をパックする必要があります。

#pragma pack(1)
typedef struct {
   char type;
   unsigned int length;
   char *buffer;
} message_t;

パケットを送信するには、次のような関数を使用します。

void SendData(char type, unsigned int length, char *data) {
   message_t packet;

   packet.type = type;
   // convert the int to network byte order
   packet.length = htonl(length);

   // Here we have two options to send the packet:
   // 1 with malloc and one send
       packet.buffer = malloc(length);
       memcpy(packet.buffer, data, length);
       length +=sizeof(char);
       length +=sizeof(int);
       // send it in one shut
       send(mySocket, (const char *)&packet, length, 0);
       // release the memory
       free(packet.buffer);

   // 2 without malloc and two sends:
       send(mySocket, (const char *)&packet, sizeof(char)+sizeof(int), 0);
       send(mySocket, data, length, 0);
}

反対側でデータを読み取るには、次のようなものを使用します。

BOOL RecvData(message_t *packet) {
   // NOTE: 
   // if packet.buffer is not NULL, the caller of this function must 
   // release the memory allocate here
   packet->buffer = NULL;

   // at the receiver, you need 2 reads:
   // 1 to know how many bytes to read
   // 2 to read those bytes.
   if (recv(mySocket, (char *)packet, sizeof(char)+sizeof(int), 0) > 0)
   {
       // convert the int to host byte order
       packet->length = ntohl(packet->length);
       packet->buffer=malloc(packet->length);
       // if we got the memory, go ahead
       if (packet->buffer != null)
       {
           if (recv(mySocket, packet->buffer, packet->length, 0) == packet->length)
               return TRUE;
       }
   }
   return FALSE;
}
于 2013-05-12T15:49:25.670 に答える
0

memcpy を使用して構造体を void メモリ ブロックにコピーします。これは、文字列または好きなものとして解釈できるものとしてリモート プロセスに送信し、それをローカル構造体にタイプキャストして、値を希望どおりに復元する必要があります。例えば

message_t my_msg;
char out_buf[MAX_LEN] = {0,};

memcpy(out_buf, my_msg, sizeof(message_t));

send_it_over_socket(out_buf);
于 2013-05-12T13:56:22.577 に答える