(c ++中的明显初学者,继续与指针斗争)
我一直在尝试将客户端的IP地址作为服务器(使用TCP),并使用指针保存它,以便以后能够重新使用它。
在上一个函数中,我接受连接并将 Socket 保存为m_clientSocket,将Socket信息保存在名为clientaddr的 struct sockaddr 中。
现在,我希望下一个函数返回客户端套接字并保存源IP ,但程序会一直崩溃。
在最后一个版本中,我尝试使用指针但转换中存在错误,即使我的研究也无法修复。
char clientIPaddr[30];
sockaddr_in clientaddr;
SOCKET m_clientSocket;
功能代码
SOCKET CmTcpListener::getNewSocket(SOCKET *hSocket, char* ptrSourceIp)
{
cout << "Retreaving socket..." << endl;
if (m_newClientConnection)
{
hSocket = &m_clientSocket;
strcpy(clientIPaddr, inet_ntoa(clientaddr.sin_addr));
ptrSourceIp = &clientIPaddr;
cout << "Socket : OK" << endl;
return *hSocket;
}
else {
cout << "No new client connection." << endl;
return false;
}
}
错误
c:\ work \ 2015 \ tcptransport \ cmtcplistener.cpp(112):错误C2440:'=': 无法从'char(*)[30]'转换为'char *' 指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换
我假设其余代码不是必需的,但如果需要,我会很快提供它
答案 0 :(得分:0)
您正在尝试将clientIPaddr
的地址指定给char*
。它的类型为char[30]
,因此获取地址会指向char
数组,而不是指向char
的指针。数组可以衰减到指针,所以只需直接指定它:
ptrSourceIp = clientIPaddr;
答案 1 :(得分:0)
罪魁祸首是
ptrSourceIp = &clientIPaddr;
clientIPaddr
的类型为char[30]
,因此&clientIPaddr
的类型为char(*)[30]
,即指向30个字符数组的指针。删除&
你会没事的,因为数组的名称本身就是指向其第一个元素的指针(技术上,数组会衰减为指针)
ptrSourceIp = clientIPaddr;
但是,现在,你没有对ptrSourceIp
做任何事情,在函数结束时它将保持不变,因为它像任何其他变量一样通过值传递。如果你想修改传递的指针ptrSourceIp
,那么你需要传递一个指向它的指针(即指向指针指向char的指针),所以函数的原型应该是:
SOCKET CmTcpListener::getNewSocket(SOCKET *hSocket, char** ptrSourceIp)
您传递的第二个参数必须是&your_passed_ptr_to_char
。在函数内部,您现在可以修改传递的指针,如
*ptrSourceIp = clientIpAddr; // now we modify it