Ich habe den folgenden Code verwendet, um die hTTP-Header zu erstellen und an den Server zu senden. Wenn es jedoch empfangen wird, enthält es seltsame Zeichen.Senden von Daten aufgrund von seltsamen Zeichen in HTTP-Headern fehlgeschlagen
const char http_post_format[]=
{
"POST /%s HTTP/1.1\r\n\
Host: %s\r\n\
Content-Type: application/x-www-form-urlencoded\r\n\
Content-Length:%s\r\n\r\n\
%s\r\n"
};
Das Code-Snippet ist wie folgt:
int client_fd = -1;
int len =- 1;
char *ipstr=(char*)malloc(16);
struct sockaddr_t addr;
char *content_length=(char*)malloc(20);
char *httpRequest = (char*)malloc(556);
// cs_log("Free memory has %d bytes", MicoGetMemoryInfo()->free_memory) ;
gethostbyname(http_host, (uint8_t *)ipstr, 16);
cs_log("server address: host:%s, ip: %s", http_host, ipstr);
client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.s_ip = inet_addr(ipstr);
addr.s_port = http_port;
connect(client_fd, &addr, sizeof(addr));
Int2Str((uint8_t*)content_length, strlen(str_args));
cs_log("content_length%s\n ",content_length);
sprintf(httpRequest, http_post_format,
http_post_url,
http_host,
content_length,
str_args);
len=write(client_fd,(uint8_t *)httpRequest, strlen(httpRequest));
if(len == -1){
memset(httpRequest,0,556);
}
cs_log("len%d\n%s\n ",len,httpRequest);
free(httpRequest);
httpRequest = NULL;
close(client_fd);
free(content_length);
content_length=NULL;
free(ipstr);
ipstr =NULL;
Die erwarteten HTTP-Header, die als unten analysiert werden kann:
POST /sensor/sensorinfo HTTP/1.1
Host: 192.168.199.218
Content-Type: application/x-www-form-urlencoded
Content-Length:240
info={ "WIFI_INFO": { "WIFI": { "connected": "1", "strength": "80", "ip": "192.168.199.131", "mac": "d0bae4075913", "ssid": "chaosuan" } }, "DHT11_INFO": { "DHT": { "T": "28", "H": "43" } }, "DSM501A_INFO": { "DSM501A": { "VALUE": "0" } } }
Die eigentlichen Daten empfangen einige seltsame Zeichen in Inhalt enthält -Länge.
POST /sensor/sensorinfo HTTP/1.1
Host: 192.168.199.218
Content-Type: application/x-www-form-urlencoded
Content-Length:240棍*橪馭嶲誳3
info={ "WIFI_INFO": { "WIFI": { "connected": "1", "strength": "74", "ip": "192.168.199.131", "mac": "d0bae4075913", "ssid": "chaosuan" } }, "DHT11_INFO": { "DHT": { "T": "28", "H": "43" } }, "DSM501A_INFO": { "DSM501A": { "VALUE": "0" } } }
Dies ist die Int2Str Funktion
void Int2Str(uint8_t* str, int32_t intnum)
{
uint32_t i, Div = 1000000000, j = 0, Status = 0;
for (i = 0; i < 10; i++)
{
str[j++] = (intnum/Div) + 48;
intnum = intnum % Div;
Div /= 10;
if ((str[j-1] == '0') & (Status == 0))
{
j = 0;
}
else
{
Status++;
}
}
}
Sieht aus wie ein vergessener NUL-Terminator. Wahrscheinlich fehlt am Ende der 'int2Str'-Funktion ein' str [j] = 0'. –
Warum sollte man nicht einfach 'content_length' zu einem int machen und% d format spec verwenden? –