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编译
答案 0 :(得分:2)
getpeername
期望传递两个指向内存的指针,它可以写入客户端地址和客户端地址长度。所以你的原始代码
sockaddr* clientAddress;
socklen_t* clientAddressLength;
getpeername ( clientSocket , clientAddress , clientAddressLength );
错误,因为两个指针clientAddress
和clientAddressLength
未初始化。这些指针将指向内存中的某个任意位置,并且写入它们可能会导致程序崩溃,如果不是之后不久就会立即崩溃。正确调用getpeername
的最简单方法是声明两个变量,而不是两个指针,然后使用地址运算符'&'将这些变量的地址传递给getpeername
。喜欢这个
sockaddr clientAddress;
socklen_t clientAddressLength;
getpeername ( clientSocket , &clientAddress , &clientAddressLength );