1

libwebsockets をサーバーとして使用するときに、クライアントの IP アドレスを取得する方法を理解するのに苦労しています。

ドキュメントについて私が理解していることからlibwebsockets_get_peer_addresses、コールバックでのみ使用できますLWS_CALLBACK_FILTER_NETWORK_CONNECTIONが、その時点でユーザーデータ構造体は初期化されていないように見えるため、ここに保存しようとするとセグメンテーション違反が発生します。

Apache や nginx などの他の Web サーバーと同様に、IP アドレスが要求ヘッダーにあると予想していましたが、このライブラリでは、要求プロセスの特定の部分でのみ使用できるようで、ヘッダーにコピーされません。 .

これは私がLWS_CALLBACK_FILTER_NETWORK_CONNECTION内で試みていることです:

char client_name [IP_SIZE];
char client_ip   [IP_SIZE];

libwebsockets_get_peer_addresses(context, wsi, (int)(long)in, 
                                 client_name, sizeof(client_name),
                                 client_ip, sizeof(client_ip));

strncpy(pss->ip, client_ip, sizeof(client_ip)); // segfault

strncpy別のコールバック ( ) の内部をテストしたLWS_CALLBACK_HTTPので、それが初期化されたときに機能するはずです。pss

ライブラリのドキュメントを理解するのは非常に難しいと思うので、助けていただければ幸いです。

4

2 に答える 2

2

あなたはほとんどそれを持っていました。

を に置き換える(int)(long)inlibwebsocket_get_socket_fd(wsi)、他のコールバックで使用できます。

switch (reason) {
    case LWS_CALLBACK_HTTP:
             int IP_SIZE = 50;
             char client_name [IP_SIZE];
             char client_ip   [IP_SIZE];
             libwebsockets_get_peer_addresses(context, wsi, libwebsocket_get_socket_fd(wsi), 
                      client_name, sizeof(client_name), 
                      client_ip, sizeof(client_ip));

             fprintf(stderr, "Received network connect from %s (%s)\n",
                                    client_name, client_ip);
             ...
}

出力:

xxxxxxxx.dip0.t-ipconnect.de (93.208.91.xxx) からネットワーク接続を受信しました

于 2015-04-08T13:56:14.590 に答える