gpt4 book ai didi

c++ - 结构问题和 int 到 char* 的转换

转载 作者:行者123 更新时间:2023-11-28 06:06:47 24 4
gpt4 key购买 nike

在我的第一个程序中,我找到了一个本地 ip 地址 (int iip),我想做的是在结构 (Ins c) 中发送该 ip 地址以及端口 (int port = 1100)。然后我希望第二个程序接收这个结构并挑选出 ip 地址和端口以便稍后在 tcp 连接中使用。

n_addr inaddr;
inaddr.s_addr = htonl(iip);

int udp_socket_info;
struct sockaddr_in udp_server;

udp_socket_info = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket_info == -1) {
puts("Could not create udp socket");
}
puts("Udp socket created");

udp_server.sin_addr.s_addr = inet_addr("225.0.0.37");
udp_server.sin_port = htons(1100);
udp_server.sin_family = AF_INET;

int port = 1100;


Ins c(iip, port);
sendto(udp_socket_info, &c, sizeof(c), 0, (struct sockaddr *)&udp_server, sizeof(udp_server));
puts("STRUCT Message Sent");

在一个程序中,我收到以下结构:

Ins c;
if (recvfrom(udp_socket_info, &c, sizeof(c), 0, &addr, &fromlen) < 0) {
perror("Recvfrom error:");
}
puts("STRUCT Message Received");

tcp_ip = c.address;
tcp_port = c.port;

在头文件 MonReqServer.hh 中,我将 tcp_ip 和 tcp_port 声明为 char*,因为这是我需要用来设置 tcp 套接字的内容。

 private:
char* tcp_ip;
char* tcp_port;

下面是Ins.hh的header

namespace Pds {
class Ins
{
public:
Ins();
enum Option {DoNotInitialize};
explicit Ins(Option);
explicit Ins(unsigned short port);
explicit Ins(int address);
Ins(int address, unsigned short port);
Ins(const Ins& ins, unsigned short port);
explicit Ins(const sockaddr_in& sa);

int address() const;
void address(int address);
unsigned short portId() const;

int operator==(const Ins& that) const;

protected:
int _address;
unsigned _port;
};
}

这些是我的错误:

MonReqServer.cc: In member function 'virtual void Pds::MonReqServer::routine()':
MonReqServer.cc:79: error: cannot resolve overloaded function 'address' based on conversion to type 'char*'
MonReqServer.cc:80: error: 'class Pds::Ins' has no member named 'port'

我的问题是收到地址后如何将其转换为 char*?具体来说,从 int 切换到 char* 的命令是什么?我该如何实现它?还有为什么说Ins has no member named port?我以为 ip 地址和端口是 Ins 的意思?如果我的问题不清楚或者您需要任何其他信息,请告诉我?谢谢!

最佳答案

首先,危险!

char* tcp_ip;
char* tcp_port;

这些指针需要指向某物,并且它必须是具有一定程度的持久性的东西。我认为这不太可能发生,因此您应该在此处定义存储。

char tcp_ip[SizeOfBiggestIPAddressPossible];
char tcp_port[SizeOfBiggestPortNumberPossible];

在哪里

#define     SizeOfBiggestIPAddressPossible (4+1+4+1+4+1+4+1+4+1+4+1+4+1+4+1)
#define SizeOfBiggestPortNumberPossible (5+1)

但这只是愚蠢的。由于 OP 标记为 C++,让我们只使用几个字符串,省去了缓冲区溢出和其他怪事的麻烦。

std::string tcp_ip;
std::string tcp_port;

接下来,把一个数字改成一个字符串在这里已经有一半没有值(value)了。 Number to string 适用于端口号...

tcp_port = std::to_string(c.portId());

或者如果缺少 C++11 支持,请创建以下函数

template <class TYPE>
std::string toString(TYPE val)
{
std::stringstream temp;
temp << val;
return temp.str();
}

并调用它

tcp_port = toString(c.portId());

但是将数字转换为 IP 地址完全是另一回事。 IP 地址是一个带格式的字符串,点或冒号与数字混合在一起。如果有一个好的 C++ 方法来执行此操作,我不知道。

在 *nux 地区,您调用 inet_ntop .

假设Ipv4(未编译测试,但应该接近):

char temp[INET_ADDRSTRLEN];
struct sockaddr_in sockAddr;
sockAddr.sin_addr.S_un.S_addr = htonl(c.address());
if (inet_ntop(AF_INET, &addr, temp, INET_ADDRSTRLEN)!= null)
{
tcp_ip = temp;
}
else
{
std::cerr << "Bad address" << std::endl;
// handle error
}

在 Windows 中,您可以调用 same function或一大堆特定于 Windows 的替代方案。

你现在有两个漂亮、礼貌的 C++ 字符串为你完成所有内存管理繁重的工作。要取回 C 风格的字符串 (const char *),请使用 c_str 方法。

const char * addrp = c.address().c_str();

如果你需要一个非 const char *,有人应该挨一巴掌。

编辑:错过了明显的 IP4 only hack

这将为您提供字符串形式的地址,但它不支持 future 。或者过去 IPv6 已经存在了 35 年?

uint32_t temp = c.address(); 
std::stringstream addr;
addr << ((temp >> 24) & 0xFF) << '.' <<
((temp >> 16) & 0xFF) << '.' <<
((temp >> 8) & 0xFF) << '.' <<
((temp >> 0) & 0xFF);
tcp_ip = addr.str();

关于c++ - 结构问题和 int 到 char* 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32236322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com