0

inet_ntoa() 函数在以下代码中导致分段错误错误。请告诉我,为什么。我该如何解决?非常感谢!

void ClientAdd ( int clientSocket )
{
    sockaddr            clientAddress;
    socklen_t           clientAddressLength;
    sockaddr_in*        clientAddressInternet;
    char*               clientHost;

    getpeername ( clientSocket , &clientAddress , &clientAddressLength );
    clientAddressInternet = (struct sockaddr_in*)&clientAddress;
    clientHost = inet_ntoa ( clientAddressInternet->sin_addr );
};

我认为这都是关于 inet_ntoa 的返回值。但是不知道怎么查。。。

PS 用 g++@debian 编译

4

1 回答 1

2

getpeername期望传递两个指向内存的指针,它可以在其中写入客户端地址和客户端地址长度。所以你的原始代码

sockaddr*            clientAddress;
socklen_t*           clientAddressLength;

getpeername ( clientSocket , clientAddress , clientAddressLength );

是错误的,因为这两个指针clientAddressclientAddressLength未初始化。这些指针将指向内存中的某个任意位置,并且写入它们可能会导致程序崩溃,如果不是立即然后不久之后。正确调用的最简单方法getpeername是声明两个变量,而不是两个指针,然后使用地址运算符 '&' 将这些变量的地址传递给getpeername. 像这样

sockaddr            clientAddress;
socklen_t           clientAddressLength;

getpeername ( clientSocket , &clientAddress , &clientAddressLength );
于 2012-08-06T05:35:40.543 回答