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

2

格式化getExternalIpRequestHeader时,Content-Length标头正在使用%s,它需要一个char*值,但是您为它提供了 的返回值strlen(),它是一个int,因此您需要改为使用%d

于 2013-11-13T00:10:18.543 回答