C++ <策略文件请求 />

C++ <policy-file-request />

本文关键字:gt 请求 策略 lt C++ 文件      更新时间:2023-10-16

希望这将是我最后一个与套接字相关的C++问题。我有一个.SWF 文件,并发送策略文件请求。

我检查我的传入数据字符 0 是否<,所以像这样:

if (raw[0] == '<')

然后我发送我的政策狗屎:

            send(this->s, Env::Policy().c_str(), sizeof(Env::Policy()), 0);
            std::cout << "Sent " << Env::Policy().c_str() << std::endl;
            running = false;
            closesocket(this->s);
            break;

break;将停止 while(此>正在运行(循环。我的策略字符串:

std::string Env::Policy()
{
    char c = 0;
    return "<?xml version="1.0"?>rn<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">rn<cross-domain-policy>rn<allow-access-from domain="*" to-ports="1-31111" />rn</cross-domain-policy>" + c;
}

但是每次我发送它时,什么也没发生。套接字不会接收新连接(如在 C# 套接字服务器中(。但是当我在.swf上重新连接时,它将接受新的连接。这是怎么回事?

我的完整时间(这个>运行(循环:

while (running)
{
    char c[256];
    int bits = recv(s, c, sizeof(c), 0);
    if (bits > 0)
    {
        std::string data = c;
        std::string raw = data.substr(0, bits);
        std::cout << "First char: " << raw[0] << std::endl;
        if (raw[0] == '<')
        {
            send(this->s, Env::Policy().c_str(), sizeof(Env::Policy()), 0);
            std::cout << "Sent " << Env::Policy().c_str() << std::endl;
            running = false;
            closesocket(this->s);
            break;
        }
        int header = Env::B64Decode(raw.substr(3, 2));
        switch (header)
        {
        case 202:
            this->msg = new ServerMessage("DA");
            this->msg->AddInt32(6);
            this->msg->AddInt32(0);
            this->msg->AddInt32(1);
            this->msg->AddInt32(1);
            this->msg->AddInt32(1);
            this->msg->AddInt32(3);
            this->msg->AddInt32(0);
            this->msg->AddInt32(2);
            this->msg->AddInt32(1);
            this->msg->AddInt32(4);
            this->msg->AddInt32(1);
            this->msg->AddString("dd-MM-yyyy");
            this->msg->AddChar(2);
            this->sendData(this->msg->toString());
            this->msg = new ServerMessage("@H");
            this->msg->AddString("[100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,176,177,178,180,185,190,195,200,205,206,207,210,215,220,225,230,235,240,245,250,255,260,265,266,267,270,275,280,281,285,290,295,300,305,500,505,510,515,520,525,530,535,540,545,550,555,565,570,575,580,585,590,595,596,600,605,610,615,620,625,626,627,630,635,640,645,650,655,660,665,667,669,670,675,680,685,690,695,696,700,705,710,715,720,725,730,735,740]");
            this->msg->AddChar(2);
            this->sendData(this->msg->toString());
            break;
        default:
            std::cout << "Unregistered header " << header << std::endl;
            break;
        }
    }
    else
    {
        break;
    }
}
 std::string data = c;

仅当字符串肯定以 0 结尾时才好

 std::string raw = data.substr(0, bits);

你可以做得更简单

 const std::string raw(c, c+bits);

在您的策略函数中,无缘无故地存在 char c,但如果它的值为>0,则可能会导致问题。

最重要的是,发送sizeof(Env::Policy())字节根本没有意义,您应该发送整个字符串!

const auto& policy = Env::Policy();
send(this->s, policy, policy.size() + 1, 0);

也许没有 +1,这取决于您是否想要 0。