如何获取最后收到的数据包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
的问题。
答案 0 :(得分:1)
const char* strPort = std::to_string(ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port)).c_str();
创建一个临时string
,获取string
内部缓冲区的地址,然后销毁string
,因为string
不是{\ n}分配给任何东西。这意味着由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());
答案 1 :(得分:1)
你不需要它:
short port = ntohs(((struct sockaddr_in*)&RecvAddr)->sin_port);
printf("%s | %d\n", strIP, port);