C ++ inet_ntoa导致分段错误

时间:2012-08-05 22:13:30

标签: c++ unix g++

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的回报价值。但我不知道如何找出......

使用g ++ @ debian进行PS编译

1 个答案:

答案 0 :(得分:2)

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

sockaddr*            clientAddress;
socklen_t*           clientAddressLength;

getpeername ( clientSocket , clientAddress , clientAddressLength );

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

sockaddr            clientAddress;
socklen_t           clientAddressLength;

getpeername ( clientSocket , &clientAddress , &clientAddressLength );