在最后一个 recvfrom() 中获取 IP 和端口作为 const char*
Get IP and Port as const char* in last recvfrom()
如何获取最后收到的数据包 IP 地址和端口并将其存储为 const char*
?
const char* strIP = inet_ntoa(((struct sockaddr_in*)&RecvAddr)->sin_addr);
const char* strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port)).c_str();
printf("%s | %s\n", strIP, strPort);
当前使用的代码将打印 IP,但是我们的端口将是空白的,所以我认为将 USHORT sin_port
转换为 const char* strPort
是一个问题。
const char* strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port)).c_str();
创建一个临时 string
,获取 string
的内部缓冲区的地址,然后销毁 string
因为 string
没有分配给任何东西.这意味着 c_str
返回并由 strPort
引用的指针是无效的,使用它会导致未定义的行为。
最好只保留 string
,直到您不再需要它为止。
std::string whatever = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port));
const char* strPort = whatever.c_str();
或
std::string strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port));
printf("%s | %s\n", strIP, strPort.c_str());
你不需要它:
short port = ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port);
printf("%s | %d\n", strIP, port);
如何获取最后收到的数据包 IP 地址和端口并将其存储为 const char*
?
const char* strIP = inet_ntoa(((struct sockaddr_in*)&RecvAddr)->sin_addr);
const char* strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port)).c_str();
printf("%s | %s\n", strIP, strPort);
当前使用的代码将打印 IP,但是我们的端口将是空白的,所以我认为将 USHORT sin_port
转换为 const char* strPort
是一个问题。
const char* strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port)).c_str();
创建一个临时 string
,获取 string
的内部缓冲区的地址,然后销毁 string
因为 string
没有分配给任何东西.这意味着 c_str
返回并由 strPort
引用的指针是无效的,使用它会导致未定义的行为。
最好只保留 string
,直到您不再需要它为止。
std::string whatever = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port));
const char* strPort = whatever.c_str();
或
std::string strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port));
printf("%s | %s\n", strIP, strPort.c_str());
你不需要它:
short port = ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port);
printf("%s | %d\n", strIP, port);