2

特定のポートで着信接続をリッスンするために、新しいソケットをコンピューターのアドレスにバインドするように設計されたコードを作成しました。getaddrinfo を使用しています。これが最善の方法ですか?ポート整数を文字列に変換するのは無意味に思えます。sprintf を必要とせずにこれを行う方法はありますか?

bool CBSocketBind(void * socketID,u_int16_t port){
    struct addrinfo hints,*res,*ptr;
    int socketIDInt;
    // Set hints for the computer's addresses.
    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    // Get host for listening
    char portStr[6];
    sprintf(portStr, "%u",port);
    if (getaddrinfo(NULL, portStr, &hints, &res) != 0)
        return false;
    // Attempt to bind to one of the addresses.
    for(ptr = res; ptr != NULL; ptr = ptr->ai_next) {
        if ((socketIDInt = socket(ptr->ai_family, ptr->ai_socktype,ptr->ai_protocol)) == -1)
            continue;
        if (bind(socketIDInt, ptr->ai_addr, ptr->ai_addrlen) == -1) {
            close(socketIDInt);
            continue;
        }
        break; // Success.
    }
    freeaddrinfo(res);
    if (ptr == NULL) // Failure
        return false;
    socketID = malloc(sizeof(int));
    *(int *)socketID = socketIDInt; // Set socket ID
    // Make socket non-blocking
    fcntl(socketIDInt,F_SETFL,fcntl(socketIDInt,F_GETFL,0) | O_NONBLOCK);
    return true;
}
4

3 に答える 3

3

の設計はgetaddrinfo()、特定のサービスに異なる指定を使用する可能性のあるネットワークプロトコルに対応することを目的としています。指定は数値ではない場合があります。または、TCPで使用される16ビット整数のポート番号よりも大きい数を使用する場合があります。最大限の柔軟性を実現するために、サービス名を提供することができます。これは、プロトコルおよびプロトコルに固有のその他の情報に変換できます。たとえば、ftp→IPv4またはIPv6 TCPポート21。常にIPv4またはIPv6とTCPを使用することがわかっている場合は、サービス名を渡しNULLて、返されたソケットアドレス構造(sin_portIPv4の場合はsin6_portフィールドまたはIPv6の場合はフィールド)に自分でポート番号を入力できます。ただし、使用するだけの方がおそらくクリーンですsprintf(); これにより、IPv4とIPv6で使用されるさまざまなソケットアドレス構造、およびポート番号をネットワークバイトオーダーで格納する要件が処理され、コードを変更せずに他の将来のプロトコルをサポートできる場合もあります。

于 2012-07-16T19:43:15.407 に答える
2

getaddrinfo()整数ではなく文字列を取る理由は、サービスが単なるポートである必要がないためです。たとえば、ユーザーはサービス「http」を要求できます。

于 2012-07-16T16:46:04.883 に答える
1

getaddrinfo()これは、州で通常どのように使用されているかについてはかなり慣用的に見えますAI_PASSIVE。文字列化された数は典型的です。

于 2012-07-16T16:42:58.400 に答える