0

StringCbPrintf を使用してバッファをフォーマットする方法に問題があります。ここでは、HTTP リクエストであるべきものを示します。

char getExternalIpRequest[1200]; 
     ZeroMemory(getExternalIpRequest, 1200);
     StringCbPrintf(getExternalIpRequest, 1200,
                                        "<?xml version=\"1.0\"?>"
                                        "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
                                        "<SOAP-ENV:Body>"
                                        "<m:AddPortMapping xmlns:m=\"urn:schemas-upnp-org:service:WANIPConnection:1\">"
                                        "<NewRemoteHost xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">"
                                        ""
                                        "</NewRemoteHost>"
                                        "<NewExternalPort xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"ui2\">"
                                        "%s"
                                        "</NewExternalPort>"
                                        "<NewProtocol xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">"
                                        "%s"
                                        "</NewProtocol>"
                                        "<NewInternalPort xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"ui2\">"
                                        "%s"
                                        "</NewInternalPort>"
                                        "<NewInternalClient xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">"
                                        "%s"
                                        "</NewInternalClient>"
                                        "<NewEnabled xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"boolean\">"
                                        "1"
                                        "</NewEnabled>"
                                        "<NewPortMappingDescription xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"string\">"
                                        "%s"
                                        "</NewPortMappingDescription>"
                                        "<NewLeaseDuration xmlns:dt=\"urn:schemas-microsoft-com:datatypes\" dt:dt=\"ui4\">"
                                        "0"
                                        "</NewLeaseDuration>"
                                        "</m:AddPortMapping>"
                                        "</SOAP-ENV:Body>"
                                        "</SOAP-ENV:Envelope>\r\n\r\n", externalPort, protocol, internalPort, internalp, entryDescription);
// externalPort, protocol, internalPort, internalp, entryDescription are **char*** type.
char getExternalIpRequestHeader[1500]; 
     ZeroMemory(getExternalIpRequestHeader, 1500);

     StringCbPrintf(getExternalIpRequestHeader, 1500,
                                                  "POST /UD/?3 HTTP/1.1\r\n"
                                                  "Content-Type: text/xml; charset=\"utf-8\"\r\n" 
                                                  "SOAPAction: \"urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress\"\r\n"
                                                  "User-Agent: Mozilla/4.0 (compatible; UPnP/1.0; Windows 9x)\r\n"
                                                  "Host: %s\r\n"
                                                  "Content-Length: %s\r\n"
                                                  "Connection: Keep-Alive\r\n"
                                                  "Cache-Control: no-cache\r\n"
                                                  "Pragma: no-cache\r\n\r\n", upnpDeviceIp, strlen(getExternalIpRequest));

しかし、コンソールでエコーすると、アクセス違反メッセージが表示されます。

更新 StringCbPrintf(getExternalIpRequest) または StringCbPrintf(getExternalIpRequestHeader) のいずれかをコメントすると、クラッシュしないことに気付きました。

4

1 に答える 1