Ich habe Spring-Boot-Server, die ich in AWS ausgeführt werde. Der Server funktioniert einwandfrei. Ich kann mit Chrom, Postman und Curl ohne Probleme auf sie zugreifen. Ich habe jedoch ein eingebettetes Gerät, auf dem C ausgeführt wird, und ich verwende Sockets, um eine Verbindung zu meinem Server herzustellen. Auf dem eingebetteten Gerät läuft Linux, sodass ich mit curl problemlos mit dem Server kommunizieren kann. Jedoch scheint mein C-Socket-Code die Ressource auf dem Server nicht zu finden. Ich bekomme immer 404.Einfache C-Sockets-HTTP-Programm kann nicht finden Ressource: 404
Hier ist meine Embedded-Client-Code,
#include <stdarg.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <resolv.h>
#include <errno.h>
int main() {
// Define some parameters
int sockfd, bytes_read;
struct sockaddr_in dest;
char buffer[4000];
char hdr[1000];
// Create Server Client Strings
bzero(hdr, sizeof(hdr));
strcpy(hdr, "GET /hello HTTP/1.1\r\n");
strcat(hdr, "Host: 52.200.39.81\r\n\r\n");
// Clean things up a bit before sarting
printf("\n\n");
// Create Socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Socket not created\n");
return 0;
}
// Initialize server address/port struct
bzero(&dest, sizeof(dest));
// *** Added this line to fix the code ***
dest.sin_addr.s_addr = inet_addr("52.200.39.81", &dest.sin_addr.s_addr);
dest.sin_family = AF_INET;
dest.sin_port = htons(8080);
if (inet_addr("52.200.39.81", &dest.sin_addr.s_addr) == 0) {
printf("Incorrect Address Expression\n");
return 0;
}
// Connect Socket
if (connect(sockfd, (struct sockaddr*)&dest, sizeof(dest)) != 0) {
printf("Socket Connection Failed\n");
close(sockfd);
return 0;
}
// Send data
if (send(sockfd, hdr, strlen(hdr), 0) < 0) {
printf("Send Data Failed\n");
return 0;
}
printf("Socket successfully sent\n");
printf("\nSend Message - TxBufferSize = %d\n\n",strlen(hdr));
printf("%s", hdr);
bzero(buffer, sizeof(buffer));
bytes_read = recv(sockfd, buffer, sizeof(buffer), 0);
if (bytes_read < 0) {
printf("Read Data Failed\n");
}
if (bytes_read > 0) {
// Print out receive buffer
printf("\n\nReceived Message -- RxSize = %d \n\n", strlen(buffer));
printf("%s", buffer);
}
if (bytes_read == 0) {
printf("No Read Bytes Received\n");
}
/*---Clean up---*/
close(sockfd);
return 0;
}
Hier ist, was ich zurückkomme,
[email protected]:~$ ./helloworld
Socket successfully sent
***** Send Message -- TxBufferSize = 80 *****
GET http://52.200.39.81:8080/hello HTTP/1.1
Host: 52.200.39.81
accept: */*
***** Received Message -- RxBufferSize = 467 *****
HTTP/1.1 404 Not Found
Date: Sat, 02 Apr 2016 17:36:37 GMT
Server: Apache/2.2.22 (Debian)
Vary: Accept-Encoding
Content-Length: 283
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /hello was not found on this server.</p>
<hr>
<address>Apache/2.2.22 (Debian) Server at 52.200.39.81 Port 8080</address>
</body></html>
[email protected]:~$
Wenn ich den curl Befehl auf dem Embedded-Gerät verwenden,
[email protected]:~$ curl 52.200.39.81:8080/hello
Greetings WebServiceTest1 -- ServiceCount = 11
[email protected]:~$
Ich bekomme die richtige Antwort vom Server. Ich bin also zuversichtlich, dass das Embedded-Gerät mit meinem Server kommuniziert. Kann einfach nicht scheinen, dass der Socket-Code funktioniert. Jede Hilfe wäre willkommen.
Wenn Sie mit dem ausführlichen Flag Curl ausführen: curl -v 52.200.39.81:8080/hello, können Sie die Header es geschickt sehen. Versuchen Sie es mit "GET/Hallo HTTP/1.1 \ r \ n" anstelle von "GET http://52.200.39.81:8080/hello HTTP/1.1 \ r \ n" –
Ich versuchte "Get/Hallo HTTP/1.1 \ r \" n "ohne Glück. Gute Empfehlung mit curl -v ... ich habe es ausprobiert und den Header genau in mein Programm kopiert, ohne Glück. Das ist sehr beunruhigend. Ich habe diesen exakten Prozess vorher auf anderen Plattformen gemacht. – skmansfield
Ich habe den Code in dieser Frage http://stackoverflow.com/questions/11208299/http-get-request-using-c-without-libcurl geändert. Versuchen Sie diesen Code: http://pastebin.com/MNHLS77c, hallo,./Hello 52.200.39.81, es funktioniert, können Sie jetzt suchen, was falsch mit Ihrem Code durch den Vergleich –