2016-04-26 5 views
1

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++; 
    } 
} 
} 
+2

Sieht aus wie ein vergessener NUL-Terminator. Wahrscheinlich fehlt am Ende der 'int2Str'-Funktion ein' str [j] = 0'. –

+4

Warum sollte man nicht einfach 'content_length' zu einem int machen und% d format spec verwenden? –

Antwort

2

Sie zu NUL vergessen Zeichenfolge in Int2Str beenden:

Das Ende dieser Funktion sollte wie folgt aussehen:

... 
    { 
    Status++; 
    } 
    } 

    str[j] = 0; // <<< add this 
} 

Haftungsausschluss: Ungeprüfter Code, möglicherweise gibt es weitere Probleme.

Übrigens, warum hast du Int2Str geschrieben? Die itoa oder die mehr Standard strtol Funktion machen die gleiche Arbeit.

Sie hätten sogar direkt sprintf mit dem %d Formatbezeichner verwenden können, was noch einfacher ist.

Exkurs

+ 48 ist schlecht. Schreiben Sie lieber + '0', damit niemand erraten muss, dass es der ASCII-Code für das '0'-Zeichen ist.

+0

'Itoa' ist kein Standard. 'sprintf' würde das auch machen. – Ouss4

+0

@ Ouss4 danke, Antwort verbessert. –

0

Eigentlich ist das Problem in 0-Terminator in Int2Str. Es existiert nicht in dem bereitgestellten Code und sollte eingefügt werden, nachdem die Zeichenfolge gefüllt wurde.

Es gibt jedoch eine Reihe kleinerer Probleme, die möglicherweise die Ausführung beeinflussen können. 1) Keine connect() - Ergebnisprüfung (Server wurde möglicherweise nicht gefunden); 2) Keine malloc() - Ergebnisprüfung (dies ist ein kritischer Fehler, der unter bestimmten Umständen zur unerwünschten Ausführung von beliebigem Code führen könnte).

Verwandte Themen