0

基本的なソケット呼び出しを実行しようとしていて、google.com に接続しようとしていますが、接続呼び出しは常に失敗し、-1 を返します。失敗するに違いない理由

int main()
{
    int sockfd;
    struct addrinfo *ai;
    char port[4];
    if(sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0) {
        printf("socket return -1");
    }
    sprintf(port, "%d", 80);
    if(getaddrinfo("www.google.com", port, NULL, &ai) < 0)
        printf("-2\n");

    if(connect(sockfd, ai->ai_addr, sizeof(*ai->ai_addr)) < 0)
        printf("connect failed -1");
}
4

1 に答える 1

1

問題はパラメータにあると思いますsizeof(*ai->ai_addr)。ai->ai_addr は sockaddr 構造体へのポインターを返し、逆参照により構造体自体に移動します。

struct sockaddr {
   unsigned short sa_family;   // address family, AF_xxx
   char           sa_data[14]; // 14 bytes of protocol address
};

sizeof は、アドレスの長さではなく、構造体全体のサイズを返しています。

ai->ai_addrlen代わりに議論をしてみてください。

于 2013-03-27T02:45:10.393 に答える