在最后一个recvfrom()中获取IP和端口作为const char *

时间:2016-07-15 23:25:06

标签: c winsock type-conversion

如何获取最后收到的数据包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的问题。

2 个答案:

答案 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);