I am facing difficulty in how to format a buffer using StringCbPrintf, here what it should be an HTTP request:
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));
But when I echo it in console I receive access violation message.
UPDATE I noticed if I comment one of StringCbPrintf(getExternalIpRequest) or StringCbPrintf(getExternalIpRequestHeader) there will e no crash.
格式化getExternalIpRequestHeader
, Content-Length
标头使用%s
,它需要一个char*
值,但是你为它提供了strlen()
的返回值,这是一个int
,因此你需要使用%d
。
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.