Socket en C : client / serveur tout simple

Voilà j’ai un peu honte de poster ceci tellement c’est basique, j’ai récupéré deux fichiers en C pour faire un petit test client / serveur avec les sockets, voici ces deux fichiers :

server.c :

[code]// compilation : gcc -Wall -o server.o -c server.c
// gcc -o server server.o

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>

char buffer[512];
int ma_socket;

void main ( void )
{
int client_socket;
struct sockaddr_in mon_address, client_address;
int mon_address_longueur, lg;

bzero(&mon_address,sizeof(mon_address));
mon_address.sin_port = htons(30000);
mon_address.sin_family = AF_INET;
mon_address.sin_addr.s_addr = htonl(INADDR_ANY);

/* creation de socket /
if ((ma_socket = socket(AF_INET,SOCK_STREAM,0))== -1)
{
printf(“la creation rate\n”);
exit(0);
}
signal(SIGINT,fin);
/
bind serveur - socket */
bind(ma_socket,(struct sockaddr *)&mon_address,sizeof(mon_address));

/* ecoute sur la socket */
listen(ma_socket,5);

/* accept la connexion */
mon_address_longueur = sizeof(client_address);
while(1)
{
client_socket = accept(ma_socket,
(struct sockaddr *)&client_address,
&mon_address_longueur);

if (fork() == 0)
{
close(ma_socket);

lg = read(client_socket,buffer, 512);
printf("le serveur a recu: %s\n",buffer);
sprintf(buffer,"%s du serveur",buffer);
write(client_socket,buffer, 512);
shutdown(client_socket,2);
close(client_socket);
exit(0);

}
}
shutdown(ma_socket,2);
close(ma_socket);
}[/code]

client.c :

[code]// compilation : gcc -Wall -o client.o -c client.c
// gcc -o client client.o

#include <stdio.h>
#include <errno.h>
#include <signal.h>

#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define SERVEURNAME “192.168.1.106” // adresse IP de mon serveur

int to_server_socket = -1;

void main ( void )
{

char *server_name = SERVEURNAME;
struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;
long hostAddr;
long status;
char buffer[512];

bzero(&serverSockAddr,sizeof(serverSockAddr));
hostAddr = inet_addr(SERVEURNAME);
if ( (long)hostAddr != (long)-1)
bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
else
{
serverHostEnt = gethostbyname(SERVEURNAME);
if (serverHostEnt == NULL)
{
printf(“gethost rate\n”);
exit(0);
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(30000);
serverSockAddr.sin_family = AF_INET;

/* creation de la socket /
if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf(“creation socket client ratee\n”);
exit(0);
}
/
requete de connexion */
if(connect( to_server_socket,
(struct sockaddr )&serverSockAddr,
sizeof(serverSockAddr)) < 0 )
{
printf(“demande de connection ratee\n”);
exit(0);
}
/
envoie de donne et reception /
write(to_server_socket,“Toto”,4);
read(to_server_socket,buffer,512);
printf(buffer);
/
fermeture de la connection */
shutdown(to_server_socket,2);
close(to_server_socket);
}[/code]

J’ai essayé d’abord de faire mon client / serveur en boucle locale, tout fonctionne correctement. J’essaye maintenant de le faire entre pc distant, je met mon serveur sur un pc qui a l’adresse 192.169.1.106, et l’appli cliente sur un autre pc. Résultat : “demande de connection ratee”. J’ai essayé de débloquer le port 30000 en tcp sur le pc serveur, mais rien n’y fait (iptables -A INPUT -p tcp --dport 30000 -j ACCEPT). Je n’arrive pas à voir l’erreur si il y en a une dans mon code. J’ai honte, ne plus arriver à faire une socket… Je commence vraiment à rouiller :blush:

Tu peux essayer de regarder par la pour plus d’info mapage.noos.fr/emdel/reseaux.htm
ou encore par la laissus.fr/cours/node17.html

Tu as essayé le débuggeur ? C’est comme ça qu’on voit les erreurs.

(cf le topic du même nom dans cette même rubrique)

  if (fork() == 0)
  {
    close(ma_socket);

La, tu gère bien le cas je suis le fils, je ferme la socket server,
mais tu ne gere pas le cas, je suis pere, je ferme la socket client.

Bon après ton soucis, c’est bizzare

Déja commence par regarder si ton process serveur écoute sur le port 30 000.

(netstat -nlaAinet)

Ensuite, essaye de faire un telnet sur ce port (sans utiliser le client, ça limitera la quantitée de code a toi a tester).

‘man connect’ dit qu’en cas d’erreur, un code est renvoyé dans ‘errno’, tu devrais enrichir ton message de refus de connection avec ce code et éventuellement sa traduction en langage humain (dans errno.h) ?
Mais bon, moi aussi, ça fait trés longtemps que je n’ai pas écrit une ligne de C.

exact: pour avoir le message d’erreur:

[quote=“Gengis”]void main ( void ) { [/quote]Main est du type int et renvoit toujours quelques chose

tu devrais donc modifier ton void main (void) par

int main(void){ //ton prog return 0; }

Oula oui en me rendant compte de ce que vous avez écrit, je vois que j’ai des automatismes qui sont passés à la trappe. Enfin bref, voici le résultat de la commande netstat :

# netstat -nlaAinet Connexions Internet actives (serveurs et établies) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:32769 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:30000 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:5335 0.0.0.0:* LISTEN tcp 0 0 192.168.1.106:51923 207.46.24.24:1863 ESTABLISHED udp 0 0 0.0.0.0:32768 0.0.0.0:* udp 0 0 0.0.0.0:68 0.0.0.0:* udp 0 0 0.0.0.0:68 0.0.0.0:* udp 0 0 0.0.0.0:5353 0.0.0.0:* udp 0 0 0.0.0.0:1003 0.0.0.0:* udp 0 0 0.0.0.0:111 0.0.0.0:* udp 0 0 0.0.0.0:631 0.0.0.0:*

A priori tout va bien de ce côté là. En faisant le telnet, j’ai vu d’où venait le problème :

# telnet 192.168.1.106 30000 Trying 192.168.1.106... telnet: connect to address 192.168.1.106: No route to host telnet: Unable to connect to remote host: No route to host
J’avais déjà des problèmes de ce genre (No route to host aussi ! ) lorsque j’avais essayé d’utiliser la commande netcat entre deux pc et je n’avais pas réussi à résoudre ce souci.

telnet: connect to address 192.168.1.106: No route to host

ça, c’est clairement que 192.168.1.106 n’est pas la bonne adresse IP.

Vous avez un soucis de réseau…

:laughing: C’est bêta…

Bah l’adresse IP est bien la bonne, j’arrive très bien à pinger dessus donc j’ai un peu de mal à comprendre d’où vient le souci. Un service qu’i n’est pas activé ? des fichiers de configuration défectueux ? Ou peut-être autre chose…

Fichiers de configuration défectueux a priori.

Vérifiez la configuration réseau, fichier /etc/hosts

un pare feu trop serré sur la machine cible, quoi que tu en dise ?
au delà de telnet, peut être qu’hping ou fping permettrait d’avoir plus d’info sur l’etat du port vu depuis une machine distante.

Me voilà de retour et je viens de me replonger dans le code, apparament j’ai fait quelques petites modif sur les fichiers de config et ça va un petit peu mieu. J’ai mis aussi un perror pour le connect et j’obtiens ce message : Connection refused ou No route to host, cela dépend dans qui est le serveur et le client

Pourtant je pense pas que cela vienne d’un firewall trop serré.

j’ai besoine de se scripte, j’ai ajouter le code serveur sur dev c++
mais il ma donnée des erreurs il n’as pas trouver le fichier sys/types.h
merci de joindre tt les fichiere

Merci de m’aider j’ai besoine de ce tuto

Vous n’aurez probablement aucune aide si vous ne faites pas un effort de rédaction.

je veux un tuto sur les socket en langage c
j’ai essayé le code source ci-doussous mais il me donnée des erreurs des fichiers manque comme sys/socket.h