2

単純なソケット パラメーターを持つ関数を作成し、そのソケット ( setsockopt()) に別のオプションを設定するなどの基本的な命令をその関数内で実行し、関数が存在した後もオプションのままである場合、実際の違いは何ですか? または、ソケットに発生する実際の変更を保持するために、そのソケットへのパラメーターポインターを作成する必要があります。

sctp_enable_events( int socket, int ev_mask )
{
    struct sctp_event_subscribe ev;

    bzero(&ev, sizeof(ev));

    if (ev_mask & SCTP_SNDRCV_INFO_EV)
    ev.sctp_data_io_event = 1;

    /*code */

    if (setsockopt(socket,
           IPPROTO_SCTP,
           SCTP_EVENTS,
           SCTP_SET_EVENTS,
           (const char*)&ev,
           sizeof(ev)) != 0 ) {
      fprintf(where,
          "sctp_enable_event: could not set sctp events errno %d\n",
          errno);
      fflush(where);
      exit(1);
    }
}

それともこんな感じ?

 sctp_enable_events( int *socket, int ev_mask, struct sctp_event_subscribe *ev )
    {

        if (ev_mask & SCTP_SNDRCV_INFO_EV)
        ev->sctp_data_io_event = 1;

        /*code */

        if (setsockopt(*socket,
               IPPROTO_SCTP,
               SCTP_EVENTS,
               SCTP_SET_EVENTS,
               ev,
               sizeof(*ev)) != 0 ) {
          fprintf(where,
              "sctp_enable_event: could not set sctp events errno %d\n",
              errno);
          fflush(where);
          exit(1);
        }
    }

struct、int、charなどにポインターを渡すことで、関数の実行後に値を変更できます。ポインターがないと、変更はその関数でのみローカルのままになりますが、グローバルには変更されません。

しかし、setsockopt機能はどうですか?

4

2 に答える 2

1

関数は、そのsetsockopt引数をどのように考え出すかを知ることができません。したがって、異なる動作をすることはできません。あなたが書くかどうか:

f(1);

また

int x = 1;
int* xPtr = &x;
f(*xPtr);

f では検出できません。

この質問は とはまったく関係ありませんsetsockopt。ポインターと値に関する C の知識を強化することをお勧めします。この理解がなければ、C で多くの間違いを犯すことになります。

于 2015-09-19T13:58:34.923 に答える
0

効率性と、異なるコンテキストで (ポインターを逆参照することによって) これらの構造体を使用したい場合があるため、通常はポインターを構造体に渡す必要があります。

socketのパラメーターの場合setsockopt()、それは であるintため、値で渡すのに十分小さいです (また、setsockopt()関数のシグネチャにintは、ポインターではなく が必要です)。

およびその他の C システム API 関数についてsetsockopt()は、その宣言/プロトタイプを検索し、プロトタイプが必要とするのとまったく同じ型のパラメーターを提供する必要があります (必要に応じてキャストを行います)。

その場合は次のsetsockopt()ようになります。

int `setsockopt()` setsockopt(int sockfd, int level, int optname,
                              const void *optval, socklen_t optlen);
于 2015-09-19T15:43:43.147 に答える