3

サーバーアプリケーションを作成しようとしています。クライアントのIPを取得したい。私の問題は inet_ntop 関数にあります。私はそれを正しく動作させることができません。ここに私の使用法があります:

void client_loop(uint16_t port) {
     int cfd;
     int socket = bind_socket(port, INADDR_ANY);
     char ip[INET_ADDRSTRLEN];
     struct sockaddr client_addr;
     struct sockaddr_in *addr_in;
     socklen_t cli_len;
     while (work) {
        if ((cfd = TEMP_FAILURE_RETRY(accept(socket, &client_addr, &cli_len))) < 0) {
            if (EAGAIN == errno || EWOULDBLOCK == errno)
                continue;
            ERR("accept");
       }
       addr_in=(struct sockaddr_in *)&client_addr;
       inet_ntop(AF_INET, &(addr_in->sin_addr),ip, sizeof(ip)); 
       printf("INET_NTOP: %s\n",ip);
    }
}

inet_ntop を最初に使用すると、常に 0.0.0.0 が返されます。その後、正常に動作します。inet_ntop を外部関数に移動すると、localhost からの接続に対してのみ適切に機能します。ありがとう。

編集:

修理済み。問題は、cli_lenが初期化されていなかったため、accept がclient_addrを埋めていなかったことです。

この行を使用すると、ボスのように機能します。

socklen_t cli_len=sizeof(struct sockaddr);
4

1 に答える 1