2016-04-02 10 views
0

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.

+0

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" –

+0

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

+0

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 –

Antwort

0

Ok, ich habe herausgefunden, was das Problem war. Ich habe die Socket-Adresse nicht festgelegt. Eine sehr einfache Unterlassung aber das was das Problem war. Ich habe den Code aktualisiert und es funktioniert jetzt. Ich habe gethostbyname hinzugefügt, um den Code standardisierter zu machen. Die neuen Codezeilen befinden sich im Kommentarabschnitt "// Serveradresse/Portstruktur initialisieren". Ich möchte Lilas dafür danken, dass sie mir den Referenzcode zur Verfügung gestellt haben, der mich zum Wegfall der Zeile dest.sin_addr.s_addr geführt hat. Unten ist der korrigierte Code.

#include <stdarg.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <resolv.h> 
#include <netdb.h> 

int main() { 

    // Define some parameters 
    int sockfd, bytes_read; 
    struct sockaddr_in dest; 
    char *hostname = "skmdev1.net"; 
    struct hostent *hostent; 
    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: skmdev1.net\r\n\r\n"); 

    // Clean things up a bit before sarting 
    printf("\n\n"); 

    // Build the address 
    hostent = gethostbyname(hostname); 
    if (hostent == NULL) { 
     printf("error: gethostbyname(\"%s\")\n", hostname); 
     return 0; 
    } 

    // 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)); 
    dest.sin_family = AF_INET; 
    dest.sin_port = htons(8080); 
    dest.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)hostent->h_addr)); 

    if (dest.sin_addr.s_addr == INADDR_NONE) { 
     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\n\n", buffer); 
    } 

    if (bytes_read == 0) { 
     printf("No Read Bytes Received\n"); 
    } 

    /*---Clean up---*/ 
    close(sockfd); 
    return 0; 
}