Je suis un débutant quand il s'agit de programmation de socket. J'essaie actuellement de développer un serveur Web capable de traiter les requêtes HTTP de base GET et POST à partir d'un navigateur. J'utilise mon ordinateur portable en tant que serveur et le client à la fois. Donc l'idée est que je devrais être capable de taper http://127.0.0.1:PORT/ dans Firefox et mon serveur web devrait pouvoir se connecter à ce port et commencer à parler. Jusqu'à présent, le code que j'ai écrit ne semble pas fonctionner. J'utilise ConText et Cygwin pour pouvoir exécuter et exécuter le programme sous Windows. J'ai également supprimé les pare-feu du port que j'utilise. Cependant, le serveur Web ne semble pas reconnaître la connexion.Programmation de socket dans C - Webserver
Des idées pourquoi? Je joins le code que j'ai écrit jusqu'ici. Toute aide serait très grandement appréciée. Au moment où le programme ne passe pas "écoute sur le port ..". J'ai isolé la faute et il semble qu'elle soit coincée sur la déclaration que j'ai soulignée.
/* Webserver Code */
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h> // for the use of inet_ntop()
#include <netinet/in.h>
#define PORT "1500" // the port we will connect to
#define BACKLOG 10 // how many pending connections the queue will hold
void *get_in_addr(struct sockaddr *sa);
int main (void) {
int sockfd, new_fd=0;
int status;
struct addrinfo hints;
struct addrinfo *servinfo;
struct sockaddr_storage their_addr;
char s[INET6_ADDRSTRLEN];
socklen_t addr_size;
FILE *errors;
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
errors = fopen("Errors.txt", "w");
fprintf(errors,"testing...\n");
if(errors == NULL){
fprintf(stderr, "Cant open output file\n");
}
if ((status = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(errors, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
// make a socket
// socket() function returns a socket file descriptor called sockfd
sockfd = socket(servinfo->ai_family, servinfo->ai_socktype, 0);
// bind to the port we passed in to getaddrinfo()
if((bind(sockfd, servinfo->ai_addr, servinfo->ai_addrlen))== -1) {
fprintf(errors, "Binding Failed\n");
exit(1);
}
// listen on the port
if((listen(sockfd, BACKLOG))== -1) {
fprintf(errors, "Listening failed\n");
exit(1);
} else {
printf("Listening on port...\n");
}
//now accept an incoming connection
addr_size = sizeof(their_addr);
**new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size)**;
printf("new_fd = %d\n", new_fd);
if(new_fd == -1) {
fprintf(errors, "Accepting failed\n");
exit(1);
} else {
printf("The Accepting worked\n");
}
//Prints out the address of the connector
inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr *)&their_addr), s, sizeof(s));
printf("server: got connection from %s\n", s);
fclose(errors);
return 0;
}
// To obtain the client's information
void *get_in_addr(struct sockaddr *sa)
{
if (sa->sa_family == AF_INET) {
return &(((struct sockaddr_in*)sa)->sin_addr);
}
return &(((struct sockaddr_in6*)sa)->sin6_addr);
}
Merci pour cela! J'ai fait les changements que vous avez suggérés et cela fonctionne =). Maintenant, pour faire face au problème de l'interprétation des messages GET lol. Merci de votre aide. – BAkz
Indice d'expérience personnelle: vous pouvez ignorer tout dans l'en-tête HTTP jusqu'à deux nouvelles lignes. La mise en œuvre de l'analyseur syntaxique complet pour le message RFC822/RFC2822 est une corvée - vous pouvez la reporter. – Dummy00001
Ouais je sais ce que tu veux dire. Je suis confus encore = s – BAkz