Socket client / serveur

Bonjour,

j’ai un simple code en C pour établir une connexion entre client et serveur

le serveur est toujours en écoute
le client envoi un message au serveur
le serveur répond par la bonne réception

Socket_Client :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>

int main()
{
struct sockaddr_in sockserver;
char buffer[512];
int c;
in_addr_t adresse_serveur = inet_addr("127.0.0.1");

bzero(&sockserver,sizeof(sockserver));
bcopy(&adresse_serveur,&sockserver.sin_addr, sizeof(adresse_serveur));

sockserver.sin_family=AF_INET;
sockserver.sin_port=htons(3333);

//Création socket client
c=socket(AF_INET, SOCK_STREAM,0);

// Connexion au serveur
if(connect(c,(struct sockaddr *)&sockserver,sizeof(sockserver)) < 0) {
	printf("Erreur de connexion !! \n");
	exit(1);
	}

//Envoyer un message au serveur
write(c, "bonjour serveur \n", 512);

//Recvoir du message client
read(c, buffer, 512);
printf("Message serveur: %s \n", buffer);

//Terminer
close(c);
}

Socket_Server :

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

int main ()
{
int d,dc, taille_addrc;
char buf[512];
struct sockaddr_in addrs, addrc;

// création de la socket
d=socket(AF_INET, SOCK_STREAM, 0);

bzero(&addrs,sizeof(addrs));

//fonction bind
addrs.sin_family=AF_INET;
addrs.sin_port=htons(3333);
addrs.sin_addr.s_addr=htonl(INADDR_ANY);

bind(d, (struct sockaddr *)&addrs, sizeof(addrs));

//Ecoute
listen(d,5);
taille_addrc=sizeof(addrc);

while (1)
{ // Fonction accept
	dc=accept(d, (struct sockaddr *)&addrc, &taille_addrc);

//Recevoir le message du client
	read(dc,buf, 512);
	printf("Message reçu: %s\n ",buf);
// Envoyer un message au client
	write(dc,"bien reçu \n",512);
	

}
return 0;
}

je suis un débutant sur la programmation en C, et je voulu avoir de l’aide afin de modifier les deux programmes et avoir le résultat suivant :

  • le client envoi un url (page html en local) au serveur (je travail sur VM sous virtalbox)
  • le serveur répond par le continue de la page ou ouvre directement la page sur navigateur.

Merci,

Bon, ben là c’est trivial: tu remplaces le message qu’envoie le client par l’url à pomper.

Alors dans le code du serveur entre //Recevoir le message du client et // Envoyer un message au client
tu vas ouvrir un deuxiéme socket, sur le port 80 du serveur désigné par l’url (80 si l’url est http, sinon, sur https, je sais pas si l’encryptage va pas poser probléme).
Là, tu envoies sur ce socket 2 avec write() un GET <le chemin de l’url sans le ndd> HTTP/1.0\r\n\r\n sur ton socket depuis le serveur, et avec read tu chopes en retour le contenu de la page.
Aprés, tu n’as plus qu’à retransmettre dans le premier socket, pour le client.
A lire https://stackoverflow.com/questions/24321295/how-can-i-download-a-file-using-c-socket-programming

[quote=“Medback, post:1, topic:75823”]
ouvre directement la page sur navigateur.
[/quote]Si tu parles d’afficher le contenu sur le client, tu sauves ce contenu dans un fichier, par exemple, et tu lances ton navigateur dessus avec la commande C “system”:
http://ahmed-mohamed.developpez.com/tutoriels/c-plus-plus/fonction-system/

Juste une remarque: si tu n’es pas contraint au C, il y a des langages plus adaptés à ce genre de manips, comme php, python ou perl.

1 J'aime