8

次のような構造体があるとします。

struct Bitmask
{
  unsigned char payload_length: 7;
  unsigned char mask: 1;
  unsigned char opcode: 4;
  unsigned char rsv3: 1;
  unsigned char rsv2: 1;
  unsigned char rsv1: 1;
  unsigned char fin: 1;
};

const char* payload = "Hello";
const size_t payload_length = strlen(payload);

Bitmask* header = new Bitmask();
header->fin =1;
header->rsv1 = 0;
header->rsv2 = 0;
header->rsv3 = 0;
header->opcode = 1;
header->mask = 0;
header->payload_length = payload_length;

iovec iov[2];
iov[0].iov_base = (char*)header;
iov[0].iov_len = sizeof (header);
iov[1].iov_base = (char *)payload;
iov[1].iov_len = strlen(payload);

ACE_DEBUG ((LM_DEBUG,
            ACE_TEXT ("iov[0].length = %d\niov[1].length = %d\n"),
            iov[0].iov_len,
            iov[1].iov_len));

size_t bytes_xfered;
client_stream_.sendv_n (iov, 2, 0, &bytes_xfered);

cout << "Transfered " << bytes_xfered << " byte(s)" << std::endl;

適切な値で初期化しています。最後に、構造体を char* に変換して、ペイロード (char* メッセージ) を追加し、websocket 接続を介して送信できるようにします。

4

3 に答える 3

17

構造体のアドレスは最初のメンバーのアドレスと同じですか?

はい、これは実際には C および C++ 標準によって義務付けられています。C標準から:

6.7.2.1-13. 適切に変換された構造体オブジェクトへのポインターは、その初期メンバーを指します

あなたのサイズはstruct2バイトでなければなりません。ただし、ポインターを に変換する必要はありませんchar*。代わりに、 を使用して、ネットワーク経由で送信するバッファーmemcpyにコピーする必要があります。Bitmask

EDITでスキャッター ギャザー I/O を使用するため、何かiovecにキャストする必要はありませんBitmask: iov_baseisvoid*であるため、単純に設定できます。iov[0].iov_base = header;

注: これstructは、仮想関数、基本クラスなどが含まれていない場合にのみ機能します (Timo さん、ありがとう)。

EDIT2

で {0x81, 0x05} を取得するにはstruct、次のように構造要素の順序を変更する必要があります。

struct Bitmask {
    unsigned char opcode: 4; 
    unsigned char rsv3: 1; 
    unsigned char rsv2: 1; 
    unsigned char rsv1: 1; 
    unsigned char fin: 1; 
    unsigned char payload_length: 7; 
    unsigned char mask: 1;
}
于 2012-02-13T01:42:16.620 に答える
1

構造体のアドレスは、適切なキャストが使用されている限り、最初のメンバーのアドレスと同じです。以下の宣言が与えられたstruct my_struct場合、ifitemはstruct型です

my_struct, then (char *)item == &item.wp_cval.


struct my_struct
{

      char wp_cval;
      short wp_font;
      short wp_psize;


}ar[ARSIZE];
于 2012-02-13T13:11:24.667 に答える
1

はいといいえ。

一般に、これは真実ですが (dasblinkenlight が説明しているように)、特にビットフィールドには当てはまりません。C++11 9.6/3 では、「ビットフィールドへのポインターがない」ため、アドレスもありません。そして明らかに、「適切に変換された構造体オブジェクトへのポインターは、その初期メンバーを指します」は、「適切な変換」がない場合に崩壊します。

于 2012-02-13T12:56:35.377 に答える