2016-05-26 21 views
4

Ich schreibe http request Code von c++ und Java. Aber Charles kann nur http request von Java erfassen. Warum ? Charles kann keine http request bekommen? Charles kann http request von c++ nicht erfassen?Warum kann Charles HTTP-Anfrage von C++ nicht erfassen?

C++ Hauptcode:

int sockfd, ret, i, h; 
struct sockaddr_in servaddr; 
char str1[4096], str2[4096], buf[BUFSIZE], *str; 
socklen_t len; 
fd_set t_set1; 
struct timeval tv; 
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
    exit(0); 
}; 
bzero(&servaddr, sizeof(servaddr)); 
servaddr.sin_family = AF_INET; 
servaddr.sin_port = htons(PORT); 
if (inet_pton(AF_INET, IPSTR, &servaddr.sin_addr) <= 0){ 
    exit(0); 
}; 
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0){ 
    exit(0); 
} 
memset(str2, 0, 4096); 
strcat(str2, "qqCode=474497857"); 
str=(char *)malloc(128); 
len = strlen(str2); 
sprintf(str, "%d", len); 
memset(str1, 0, 4096); 
strcat(str1, "POST /webservices/qqOnlineWebService.asmx/qqCheckOnline HTTP/1.1\n"); 
strcat(str1, "Host: www.webxml.com.cn\n"); 
strcat(str1, "Content-Type: application/x-www-form-urlencoded\n"); 
strcat(str1, "Content-Length: "); 
strcat(str1, str); 
strcat(str1, "\n\n"); 
strcat(str1, str2); 
strcat(str1, "\r\n\r\n"); 
printf("%s\n",str1); 
ret = write(sockfd,str1,strlen(str1)); 

Java Hauptcode:

BufferedReader in = null; 
URL realUrl = new URL(urlNameString); 
URLConnection connection = realUrl.openConnection(); 
connection.setRequestProperty("accept", "*/*"); 
connection.setRequestProperty("connection", "Keep-Alive"); 
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 
connection.connect(); 
Map<String, List<String>> map = connection.getHeaderFields(); 
in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

Beide c++ und Java die gleiche thing.I tun HTTP-Anforderung von Wireshark erfassen kann. Ich versuche es viele Male und benutze viele verschiedene Methoden, aber es funktioniert auch nicht. Kannst du mir sagen warum?

+0

Sie eine Datei im Binär-Modus geöffnet werden soll ('fopen (Dateinamen, "wb")') und schreibt dort die Anfrage Sie versuchen, von C++ zu senden, und sie sorgfältig prüfen (in hexadezimaler Form) den Inhalt der Datei. Übrigens ist die Verwendung von '\ n'-End-Header-Zeilen suspekt: ​​Sie respektieren nicht streng das HTTP-Protokoll, das' \ r \ n' erfordert. –

Antwort

1

Sie müssen wahrscheinlich auf diese Weise öffnen:

socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

Und brauchen \r\n statt nur \n überall zu nutzen.

Versuchen Sie zuerst mit GET Verb. Die HTTP-Anforderungsnachricht ist lang und komplex, zuerst Test mit einfacher Nachricht.

Code:

auto theSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (!theSocket) 
    { 
     printf("Socket open failed"); 
     return 1; 
    } 

    printf("\nSocket Opened."); 

    auto result = connect(theSocket, (SOCKADDR*)&clientService, sizeof(clientService)); 

    if (result == -1) 
    { 
     printf("Connected failed"); 
     return 2; 
    } 

    printf("\nConnected"); 

    char buf[] = { "GET //releases.ubuntu.com/16.04/ubuntu-16.04-server-amd64.iso?_ga=1.24198131.837286503.1462436453 HTTP/1.0\r\n\r\n" }; 

    auto r = send(theSocket, buf, strlen(buf), 0); 
+0

Danke, aber es funktioniert nicht. Es ist eine einfache Postanfrage. http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=474497857 –

+0

Ich habe ähnlichen Code, und es funktioniert. Der einzige Unterschied ist, dass ich 'send' und nicht' write' benutze. – Ajay

+0

können Sie mir Ihren Code zeigen? Ich bin nicht gut in C++. –