Bonjour à tous et bonne Année 2005 !
Voilà j'ai un projet à faire, il consiste à faire une messagerie instantanée ( Client & Serveur )
J'arrive à faire communiquer un client avec le serveur :
Le client :
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
//#define DATA "ca marche\n"
int main (int argc, char *argv[]){
char msg[100];
char rc;
char buf[1024];
int sock;
int port;
struct sockaddr_in name;
struct hostent *gethostbyname();
//creation du message
printf("entrer un port :\n");
scanf(" %d",&port);
//initialisation de socket
bzero(&name, sizeof(name));
bzero(&name, sizeof(name));
sock=socket(AF_INET, SOCK_STREAM, 0);
if(sock<0){
perror("socket");
return 1;
}
name.sin_family=AF_INET;
//structure de name :
//port 9999 (arbitraire)
name.sin_port=htons(port);
name.sin_addr.s_addr=inet_addr("127.0.0.1");
fprintf(stdout,"client IP : %s, port: %d \n", inet_ntoa(name.sin_addr), ntohs(name.sin_port));
//connection au serveur
if(connect(sock,(struct sockaddr *)&name, sizeof(name))<0){
perror("connect");
close(sock);
return 1;
}
//envoie du message
if(write(sock, msg, sizeof(msg))<0){
perror("write");
close(sock);
return 1;
}
//reception du message
read(sock, &buf, 100);
printf("%s\n", buf);
close(sock);
return 0;
}
Maintenant le serveur :
/*Exemple de socket stream (TCP) de réception */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
int sock, msgsock;
size_t length;
socklen_t lemis;
struct sockaddr_in name;
struct sockaddr_in emis;
char buf[1024];
int rval, i;
int port;
//création du message
printf("entrer un port :\n");
scanf("%d",&port);
/* Creation socket AF_INET entre machines */
sock=socket(AF_INET,SOCK_STREAM,0);
if (sock<0)
{
perror("socket");
exit(1);
}
/* Initialisation de la socket */
bzero(&name,sizeof(name));
lemis=sizeof(emis);
bzero(&emis,lemis);
name.sin_family =AF_INET;
/*adresse source indifférente */
name.sin_addr.s_addr=INADDR_ANY;
/*port 9999 (arbitriare) */
name.sin_port =htons(port);
length=sizeof(name);
//permet de savoir si le socket est en cours d'utilisation
if (bind (sock,(struct sockaddr *)&name,length)!=0)
{
perror("bind");
close(sock);
exit(1);
}
/* ntohs conversion entiers format réseau to hote */
printf("Socket serveur TCP port #%d\n",ntohs(name.sin_port));
/*Début acceptation de connexion sur la socket sock Accepte
5 connexions maximum en attente*/
listen(sock,5);
do
/* Si demande de connexion ouvre une socket pour celle ci */
{
//accept la connection du client
msgsock=accept(sock,(struct sockaddr *)&emis,&lemis);
if (msgsock<0)
perror("accept");
else do
/* Récuperation des rédérences de l'émetteur pour l'impressions */
{
if(getsockname(msgsock,(struct sockaddr *)&emis,&lemis)<0)
{
perror("getsockname");
close (sock);
return 1;
}
/* ntohs conversion entiers format réseau to hote */
printf ("Socket TCP emetteur %s port: #%d\n",inet_ntoa(name.sin_addr),ntohs(emis.sin_port));
//mise a zero du buffer
bzero(buf,sizeof(buf));
//reception du message dans buffer
if ((rval=read(msgsock,buf,1024))<0)
{
perror("read");
i=1;
}
if(rval==0)
fprintf(stderr,"Fin connexion\n");
else
{
fprintf(stdout,"-->%s\n",buf);
//renvoie la valeur qui est arrivé
write(msgsock,buf,sizeof(buf));
}
}while (rval!=0);
}while(i);
close (msgsock);
return 0;
}
Voilà, en esperant que vous avez des sources ou des conseils ( je sais
qu'il faut utiliser des threads mais y a pratiquement pas de docs sur
le net ...

)
Je debute en C d'où ma demande...
Merci d'avance !
Slobberbone