简体   繁体   中英

Formatting a buffer with StringCbPrintf

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.

格式化getExternalIpRequestHeaderContent-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM