Ich habe eine Aufgabe, einen http-Server in c-Code zu implementieren. es sollte die Behandlung mehrerer Verbindungen enthalten, aber für jetzt möchte ich nur sicherstellen, dass es mit nur einer einzigen Verbindung funktioniert. erste, hier ist mein Code:HTTP-Server (c) - senden Befehl funktioniert nicht (leere Antwort vom Server)
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#define BUF_SIZE 1025
int main(int argc, char **argv)
{
uint16_t portNum = 80;
int connfd = 0, listenFd;
struct sockaddr_in serv_addr, peer_addr;
if ((listenFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket syscall failed: %s.\nExiting...\n", strerror(errno));
exit(EXIT_FAILURE);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(portNum);
if (bind(listenFd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)))
{
printf("bind syscall failed: %s\nExiting...\n", strerror(errno));
exit(EXIT_FAILURE);
}
if (listen(listenFd, 5))
{
printf("listen syscall failed: %s\nExiting...\n", strerror(errno));
exit(EXIT_FAILURE);
}
while (1)
{
/* new connection */
socklen_t addrsize = sizeof(struct sockaddr_in);
connfd = accept(listenFd, (struct sockaddr *) &peer_addr, &addrsize);
if (connfd < 0)
{
printf("\n Error : Accept Failed. %s \n", strerror(errno));
return 1;
}
char httpRequest[BUF_SIZE] = {0};
if ((recv(connfd, httpRequest, BUF_SIZE, 0)) == -1)
{
printf("recv syscall failed: %s\nExiting...\n", strerror(errno));
exit(EXIT_FAILURE);
}
char msg[BUF_SIZE] = {0};
strcpy(msg, "200 OK THIS IS A TEST");
printf("sending message...\n");
int len = strlen(msg);
if (send(connfd, msg, len, 0) < 0)
{
printf("SEND ERROR\n");
exit(EXIT_FAILURE);
}
printf("message sent!\n");
close(connfd);
close(listenFd);
// THIS IS FOR DEBUG - ignore...
return 0;
}
return EXIT_SUCCESS;
}
hier ist mein Problem: meinen Code zu testen ich den folgenden Befehl in einem anderen Linux-Terminal lief:
curl -v loaclhost:80/~/ex.txt
(wo ex.txt einfach ist ein Test Datei ...) hier ist das Problem: Ich sehe die HTTP-Anfrage sowohl in den Server und in der Curl-Ausgabe, aber es scheint, wie der Befehl "Senden" des Servers nicht funktioniert - im Curl-Fenster unter der http rquest heißt es:
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
irgendwelche ideen?
'listenFd',' maxRequests', 'peer_addr' und' BUF_SIZE' ist nicht angemeldet . Erforderliche Header fehlen ebenfalls. Warum veröffentlichen Sie kein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve)? – MikeCAT
gerade repariert es ... es ist nicht die Hauptsache, sowieso ... jetzt könnte die alles, was Sie brauchen, um mich zu helfen. Ich hoffe ... -_- – noamgot
Hmmm, konnte nicht auf meinem Raspberry Pi mit dem Ändern von 'uint16_t portNum = 80; 'nach' uint16_t portNum = 8098; 'reproduzieren, so dass es keine Root-Übertragung zum Binden benötigt. – MikeCAT