1

インターネットトラフソケットを接続する方法を理解しようとしています(しかし、セグメンテーション違反の原因です)。

int main()
{
    int status;
    WSADATA wsa;
    struct addrinfo hints ,*servinfo;
    struct sockaddr_in *servSock;
    char *ip4;

    /**initialization*/
    WSAStartup(MAKEWORD(2 ,0) ,&wsa);

    memset((void *)&hints ,NULL ,sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    ip4 = (char *)malloc(sizeof(char)*INET_ADDRSTRLEN);

    /**End of initialization*/

    status = getaddrinfo("www.google.com",DEF_PORT,&hints,&servinfo);
    checkErr("serv info" ,status ,0 ,equal ,gai_strerror);

    servSock = (struct sockaddr_in *)(servinfo->ai_addr);

    status = inet_ntop(AF_INET ,&(servSock->sin_addr) ,ip4,INET_ADDRSTRLEN);
    checkErr("ntop" ,status ,NULL ,nEqual ,gai_strerror);

    printf("IPv4 : %s",ip4);

    free(ip4);
    WSACleanup();
}

コードは inet_ntop 行で爆発します (idk why,cause im noob ^^ )

4

3 に答える 3

1

&(servSock->sin_addr) が有効かどうかを確認できますか。

于 2013-08-28T20:22:36.680 に答える
0

これはうまくいくかもしれません:

unsigned char ip4buf[4];
memcpy(ip4buf,(struct sockaddr_in *)(servinfo->ai_addr)->sin_addr,4);
...
inet_ntop(AF_INET,(void *) (&ip4buf)ip4,INET_ADDRSTRLEN);
于 2013-08-28T20:14:11.963 に答える
0

分かりました。Windows APIを使用する場合。関数gai_strerror(int errno)を使用する必要があります。WSAGetLastError()

助けてくれてありがとう。&これは、この問題に対する私のメモです。

于 2013-08-29T19:43:53.230 に答える