结构问题和int到char*的转换
Structure issue and int to char* conversion
在我的第一个程序中,我找到了一个本地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。我将tcp_ip和tcp_port声明为char*,因为我需要使用它们来设置tcp套接字。
private:
char* tcp_ip;
char* tcp_port;
下面是Ins.hh
的标题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'
我的问题是我如何把我的地址转换成一个字符*一旦我收到它?具体来说,从int转换到char*的命令是什么?我如何实现它?为什么它说Ins没有名为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)
但这是愚蠢的。因为c++中有OP标记,所以我们只使用几个字符串就可以避免缓冲区溢出和其他奇怪的问题。
std::string tcp_ip;
std::string tcp_port;
接下来,将数字转换为字符串在这里是一半无效的。
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中,您可以调用相同的函数或一整套Windows特定的替代方法。
你现在有两个漂亮的,礼貌的c++字符串为你做所有繁重的内存管理。要获取C风格的字符串(const char *),请使用c_str
方法。
const char * addrp = c.address().c_str();
如果你需要一个非const char *,那你就该挨一巴掌。
编辑:错过了明显的IP4只hack
这将获得地址作为字符串,但它不支持未来。或者过去的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();
首先你的成员被称为_port和_address,而不是port和address。它们不是公共的,所以您可以通过portId()和address()函数获得它们。其次,要将数字转换为c字符串,可以使用sprintf或itoa函数。
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;