通过UDP c++发送\0字符

2ledvvac  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(188)

我试图通过udp套接字发送以下字符数组0x11 0x00 0x00 0x00 0xb6 0x00 0x00 0x00 0x00 0xc7。我无法修复。字符数组总是在第一个0x00字符处终止。
尝试了字符串和字符数组,尝试了“\0”、“\0”和“\”、“0”,但似乎都不起作用。

string request_soladin_meter_data_command="\x11";

//  sendudppacket (Soladin_ipaddress,5007+count,request_soladin_meter_data_command);

    struct sockaddr_in udpaddr;
    int udpsocket = socket(AF_INET, SOCK_DGRAM, 0);
    if (udpsocket == -1) 
        {
            printf("Could not create socket");
        }

     udpaddr.sin_family = AF_INET;
     udpaddr.sin_port =htons(5007+count);
     udpaddr.sin_addr.s_addr = inet_addr(Soladin_ipaddress);
     
     //checks connection 
     if (connect(udpsocket,(struct sockaddr *)&udpaddr, sizeof(udpaddr)) < 0) 
     {
       perror("Connection error");
     }
//   sends message

    send(udpsocket,request_soladin_meter_data_command.c_str(),request_soladin_meter_data_command.length(),0);

type here
f5emj3cl

f5emj3cl1#

string request_soladin_meter_data_command="\x11";

字符串,总是以\x00字节结束,这就是它们的定义。
std::string的构造函数以const char *为参数,查找00字节,以计算字符串的长度,这是唯一的计算方法,没有其他方法。
所有试图将\x00填充到文本字符串中的尝试都注定要失败。所讨论的痛苦的std::string构造函数不知道这是一个虚假的尾随00字节,而不是真实的的字节。因此,它总是将所有内容提取到它看到的第一个\x00,这就是您的std::string。请享受它。
还有一些std::string构造函数不接受const char *作为参数,而这些参数可以用来构造一个带有\x00字节的实际std::string。例如,一个构造函数接受迭代器到开始和定义新字符串的“过去一次”序列的末尾。或者,你可以构造一个空字符串并在其中填充一个0字节:

string request_soladin_meter_data_command;

request_soladin_meter_data_command.push_back(0);

现在:

send(udpsocket,request_soladin_meter_data_command.c_str(),request_soladin_meter_data_command.length(),0);

这将很高兴地看到一个std::string,它有一个字节,length()将是1,这就是你很高兴的小\x00字节,通过套接字。

ars1skjm

ars1skjm2#

我建议使用字符串文字:https://en.cppreference.com/w/cpp/language/string_literal
如果你用const char*构造一个std::string,它会把它解释成一个c字符串,并使用strlen逻辑来寻找长度。
构造出初始化列表也是可能的。参见:https://en.cppreference.com/w/cpp/string/basic_string/basic_string

相关问题