30

Je n'y vois pas d'erreur a priori. Faudra tester, évidemment.

31

Ok merci bcptongue
au fait pour le n<0 ca arrive souvent? et si ca arrive c'est en general du a quoi?

32

Ca arrive en cas d'erreur. Par exemple si tu arraches le câble réseau, que tu éteints ton switch ou que tu tues le programme qui tourne de l'autre côté.

33

C'est bien ce que je craignais, ca ne marche toujours pas:
alors niveau client:
#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdlib.h>  
// atoi

#include <string.h>
// bzero

#include <unistd.h>
#include <SDL/SDL.h>


void SetPxl(int x, int y, Uint8 color, SDL_Surface *pScreen)
{
	Uint8 *bufp;
	bufp = (Uint8 *)pScreen->pixels + y*pScreen->pitch + x;
        *bufp = color;
	SDL_UpdateRect(pScreen, x, y, 1, 1);
}


int main(int argc, char** argv )
{ 
  int    sockfd,newsockfd,clilen,chilpid,ok,nleft,nbwriten;
  char c;
  struct sockaddr_in cli_addr,serv_addr;


SDL_Init(SDL_INIT_VIDEO);
SDL_Surface *pScreen = SDL_SetVideoMode(320,240,8,SDL_SWSURFACE);

for (int y=0;y<240;y++)
for (int x=0;x<320;x++)
	SetPxl(x,y,(Uint8)x+y,pScreen);

char *pDatas = (char*)pScreen->pixels;
for (int y=0;y<240;y++)
for (int x=0;x<320;x++)
	SetPxl(x,y,*++pDatas,pScreen);


printf("Taille de la SDL_Surface : %uo, %uko\n",320*240,320*240/1024);

  if (argc!=3) {printf ("usage  socket_clt adresse_serveur numero_de_por\n");exit(0);}
 
  printf ("client starting\n");  

  /* initialise la structure de donnee */
  bzero((char*) &serv_addr, sizeof(serv_addr));
  serv_addr.sin_family       = AF_INET;
  serv_addr.sin_addr.s_addr  = inet_addr(argv[1]);
  serv_addr.sin_port         = htons(atoi(argv[2]));
  
  /* ouvre le socket */
  if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
    {printf("socket error\n");exit(0);}
  
  /* effectue la connection */
  if (connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
    {printf("socket error\n");exit(0);}
  SDL_Quit();  
  
{
	int done = 0;  
	int n;
	printf("Envois de l'image en cours\n"); 
	while (done<320*240) 
	{  
		n = write(sockfd, (char*)pDatas+done, 320*240 -done);  
		if (n < 0)
		{
			printf("Erreur:(\n");
			break; /* erreur */  
		}
		done += n;  
	}  
	if (done!=320*240) 
		printf("Echec de l'envois\n"); 
	else 
 		printf("Envois reussit\n"); 
	close(sockfd);
}
  return 0;
}

-> j'ai le message erreur qui s'affiche

34

niveau server:
/* Exemple de serveur pour les sockets, le serveur 
* attend un socket et affcihe a l'ecran tout ce
* qu'il y recoit.
*
* compiler avec la commande 
* sur les pc linux 
*   cc socket_srv.c -o socket_srv 
* sur les sun
*   cc socket_srv.c -o socket_srv -lsocket -lnsl
*
* utilisation
*    socket_srv numero_de_port
*
* note: le numero de port doit etre plus grand
*       que 1024.
*
*/



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


int main(int argc, char** argv )
{ char datas[] = "bonjour\n";
	int    sockfd,newsockfd,clilen,chilpid,ok,nleft,nbwriten;
	char c;
	char pixels[320*240];
	struct sockaddr_in cli_addr,serv_addr;
	
	
	if (argc!=2) {printf ("usage: socket_srv port_number\n");exit(0);}
	
	printf ("server starting...\n");  
	
	/* ouvertture du socket */
	sockfd = socket (AF_INET,SOCK_STREAM,0);
	if (sockfd<0) {printf ("impossible d'ouvrir le socket\n");exit(0);}
	
	/* initialisation des parametres */
	bzero((char*) &serv_addr, sizeof(serv_addr));
	serv_addr.sin_family       = AF_INET;
	serv_addr.sin_addr.s_addr  = htonl(INADDR_ANY);
	serv_addr.sin_port         = htons(atoi(argv[1]));
	
	/* effecture le bind */
	if (bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
	{printf ("impossible de faire le bind\n");exit(0);}
	
	/* petit initialisation */
	listen(sockfd,1);
	
	/* attend la connection d'un client */
	clilen = sizeof (cli_addr);
	newsockfd = accept (sockfd,(struct sockaddr*) &cli_addr, &clilen);
	if (newsockfd<0) {printf ("accept error\n"); exit(0);}
	printf ("connection accepted\n");

	{
		int done = 0;  
		int n;
		char pDatas[320*240]; 
		printf("Reception de l'image en cours\n"); 
		while (done<320*240)  
		{  
			n = read(newsockfd, (char*)pDatas+done, 320*240 -done);  
			if (n < 0) 
			{
				printf("Erreur :(\n");
				break;
			}
			done += n;  
		}  

		if (n!=320*240) 
			printf("L'image n'a pas ete recue correctement\n"); 
		else 
			printf("Image recu.\n"); 
		close(sockfd);
	}

	return 0;
}

35

Niveau server:
Bloque sur reception de l'image
done=0
Niveau client:
Envois de l'image en cours
Erreursad
Echec de l'envois: done =3072


je me retrouve avec le meme problemesad

36

Trouvé !
C'est tout bête : le serveur reçoit correctement les données, le problème est là :
if (n!=320*240)  
			printf("L'image n'a pas ete recue correctement\n");  
		else  
			printf("Image recu.\n");  

=> c'est pas n qu'il faut tester, n est une variable temporaire. C'est done qu'il faut tester ^^

[edit: note que j'ai pas tout testé, j'arrive pas à compiler le client et j'ai la flemme de vérifier si sdl est installé. J'ai utilisé netcat pour balancer de la donnée au serveur]

37

pour compiler le client: g++ client.c -o client -lSDL devrait marcher, bon je vais testertongue

38

Grr , marche toujours pas je desespère.
Alors j'ai refait des sources sans SDL pour me restreindre à l'essentiel:
le server: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char** argv ) char datas[] = "bonjour\n";      int    sockfd,newsockfd,clilen,chilpid,ok,nleft,nbwriten;      char c;      char pixels[320*240];      struct sockaddr_in cli_addr,serv_addr;                  if (argc!=2) {printf ("usage: socket_srv port_number\n");exit(0);}            printf ("server starting...\n");              /* ouvertture du socket */      sockfd = socket (AF_INET,SOCK_STREAM,0);      if (sockfd<0) {printf ("impossible d'ouvrir le socket\n");exit(0);}            /* initialisation des parametres */      bzero((char*) &serv_addr, sizeof(serv_addr));      serv_addr.sin_family       = AF_INET;      serv_addr.sin_addr.s_addr  = htonl(INADDR_ANY);      serv_addr.sin_port         = htons(atoi(argv[1]));            /* effecture le bind */      if (bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)      {printf ("impossible de faire le bind\n");exit(0);}            /* petit initialisation */      listen(sockfd,1);            /* attend la connection d'un client */      clilen = sizeof (cli_addr);      newsockfd = accept (sockfd,(struct sockaddr*) &cli_addr, &clilen);      if (newsockfd<0) {printf ("accept error\n"); exit(0);}      printf ("connection accepted\n");      {           int done = 0;             int n;           char pDatas[320*240];            printf("Reception de l'image en cours\n");            while (done<sizeof(pDatas))             {                  n = read(newsockfd, pDatas+done, pDatas-done);                  if (n>0)                     printf("n=%u\n",n);                if (n < 0)                 {                     printf("Erreur :(\n");                     break;                }                done += n;             }             if (done!=sizeof(pDatas))                 printf("L'image n'a pas ete recue correctement: done = %u\n",done);            else                 printf("Image recu.\n");            close(sockfd);      }      return 0; }
le resultat dans la console:
Ordinateur-de-JackosKing:~/Desktop/Galileo jackosking$ ./server 9999
server starting...
connection accepted
Reception de l'image en cours
Erreur :(
L'image n'a pas ete recue correctement: done = 0
Ordinateur-de-JackosKing:~/Desktop/Galileo jackosking$ 

39

Pour le client: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h>  #include <string.h> #include <unistd.h> int main(int argc, char** argv ) {    int    sockfd,newsockfd,clilen,chilpid,ok,nleft,nbwriten;   struct sockaddr_in cli_addr,serv_addr;   if (argc!=3) {printf ("usage  socket_clt adresse_serveur numero_de_por\n");exit(0);}   printf ("client starting\n");     /* initialise la structure de donnee */   bzero((char*) &serv_addr, sizeof(serv_addr));   serv_addr.sin_family       = AF_INET;   serv_addr.sin_addr.s_addr  = inet_addr(argv[1]);   serv_addr.sin_port         = htons(atoi(argv[2]));   /* ouvre le socket */   if ((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)     {printf("socket error\n");exit(0);}   /* effectue la connection */   if (connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)     {printf("socket error\n");exit(0);}    {      int done = 0;        int n;      char pDatas[320*240];      printf("Envois de l'image en cours, taille=%u\n",sizeof(pDatas));       while (done<sizeof(pDatas))       {             n = write(sockfd, pDatas+done, sizeof(pDatas)- done);           if (n>0)                printf("n=%u\n",n);           if (n < 0)           {                printf("Erreur:(\n");                break/* erreur */             }           done += n;        }        if (done!=sizeof(pDatas))            printf("Echec de l'envois: done =%u\n",done);       else             printf("Envois reussit\n");       close(sockfd); }   return 0; }
Et la console:
jackosking@JackosKing-pc:~/Desktop/Galileo/ClientWebCam$ ./ClientWebCam 192.168.1.101 9999
client starting
Envois de l'image en cours, taille=76800
n=13032
jackosking@JackosKing-pc:~/Desktop/Galileo/ClientWebCam$


En tout cas merci pour ton aide.

40

d'ailleur a note que le programme ne se fini meme pas dans le client.. bisard, je comprend riensad

41

JackosKing VNR :
pour compiler le client: g++ client.c -o client -lSDL devrait marcher, bon je vais testertongue

En fait non, chez moi il me dit que SDL_surface est un type non défini (donc à la compilation, pas lors de l'édition de liens. M'enfin en même temps j'ai peut-être une version plus ancienne voire j'ai pas installé tous les en-têtes, donc....


Pour le serveur l'erreur est là :
n = read(newsockfd, pDatas+done, pDatas-done);
Le troisième paramètre de read est le nombre d'octets à lire, soit
n = read(newsockfd, pDatas+done, sizeof(pDatas)-done);

Par ailleurs, un truc : la fonction read retourne 0 si et seulement si le client a fermé la connexion. Dans ce cas, c'est pas la peine de rappeler read, elle retournera toujours 0. Tu devrais plutôt afficher un message du genre "le client a envoyé une image trop petite".

42

Ok merci beaucoup ca marche love