Bonjour,

J'ai codé un tchat en Tcp avec les socket sous Linux, il marche tres bien (connection , propagation des messages , deconection)
Maintenant je veux faire le portage sous windows , j'ai donc remplacé toutes les variables par les macros windows , et j'ai adapté les tests.
Le seul Probleme c'est au niveau du select() , qui renvoie -1 je ne sais pas pourquoi , ça enraye tout le fonctionnement car du coup un client ne peut ecrire qu'une seule fois apres quoi il passe en reception pour aucune raison.

voici le code serveur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/time.h>
 
#define BUF_LENGTH 256
#define DNS "motamarid.ddns.net"
#define PORT 30001
#define UTF8 65001
#define MAX_CLIENT 20
 
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
 
void test(int aTester , char* sujet)
{
    if(aTester)
    {
        printf("%s réussi.\n" , sujet);
    }
    else
    {
        printf("erreur de %s.\n" , sujet);
        exit(EXIT_FAILURE);
    }
}
 
int main()
{
    SetConsoleOutputCP(UTF8);
    SetConsoleTitleA("(serveur)");
    //
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
	//variables
	SOCKADDR_IN  serveur; // Br serveur
	// traitement pour BR serveur
	int descbr = socket(PF_INET, SOCK_STREAM,0);
	test(descbr,"ouverture socket publique");
	//
	serveur.sin_family = AF_INET;
	serveur.sin_addr.s_addr = INADDR_ANY;
	serveur.sin_port=htons((short)PORT);
	//BIND
	int res = bind(descbr,(SOCKADDR*)&serveur,sizeof(serveur));
	test(res!= SOCKET_ERROR,"bind");
	//
	int  i=0;
	SOCKADDR_IN  client/*[MAX_CLIENT]*/; // Br client à accepter
	SOCKET descrCli[MAX_CLIENT] ;
	for( i = 0; i < MAX_CLIENT; i ++ )
        descrCli[i] = INVALID_SOCKET;
	int taille = sizeof(client);
	fd_set tab;//tableau de descripteur
	struct timeval t;
	t.tv_sec = (long)20;
	t.tv_usec = (long)0;
	int ret = 0, ecoute=0, j ,compteur = 0;
	char buf[BUF_LENGTH];
	//
	while(1)
	{
		ecoute = listen(descbr,5);
		test(ecoute!= SOCKET_ERROR , "listen");
		//
		FD_ZERO(&tab);//initialisation
		FD_SET(descbr, &tab);
		for(i = 0 ; i < compteur ; i++)
		    if(descrCli[i] != INVALID_SOCKET)
		    	FD_SET(descrCli[i], &tab);
 
		printf("En attente d'evenement...\n");
		ret = select(FD_SETSIZE, &tab, NULL, NULL, NULL);
		test(ret != SOCKET_ERROR,"select");
		if(FD_ISSET(descbr, &tab))
		{
		    //traitement client
		    descrCli[compteur] = accept(descbr,(SOCKADDR*)&client,&taille);
		    test(descrCli[compteur] != INVALID_SOCKET, "accept");
		    printf("Client n°%d (de descripteur %d) accepté.\n",compteur,descrCli[i]);
		    compteur++;
 
		}
		for(i = 0 ; i < compteur ; i++)
		    if(descrCli[i] != INVALID_SOCKET && FD_ISSET(descrCli[i], &tab))
		    {
                int recevoir = recv(descrCli[i],buf,BUF_LENGTH,0);
                //test(recevoir,"recv");
                if(recevoir ==0) // si deconnection
                {
                    printf("Client n°%d déconnecté.\n",descrCli[i]);
                    closesocket(descrCli[i]);
                    descrCli[i] = INVALID_SOCKET;
                    continue;
                }
                printf("Le client n°%d  (de descripteur %d) a dit la phrase[%s].\n",i , descrCli[i],buf);
                for(j = 0 ; j < compteur ; j++)
                {
                    if(j != i)
                    {
                        int result = send(descrCli[j],buf,BUF_LENGTH,0);
                        test(result!= SOCKET_ERROR,"send propagation");
                    }
                }
                memset(buf,0,BUF_LENGTH);
		    }
	}
    WSACleanup();
	closesocket(descbr);
	return 0;
}
et le client:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
 
#define BUF_LENGTH 256
#define DNS "motamarid.ddns.net"
#define PORT 30001
#define UTF8 65001
 
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
 
void test(int aTester , char* sujet)
{
    if(aTester)
    {
        printf("%s réussi.\n" , sujet);
    }
    else
    {
        printf("erreur de %s.\n" , sujet);
        Sleep(3000);
        exit(EXIT_FAILURE);
    }
}
 
void getIp(char* nom , char* adresse)
{
	struct hostent* mahostent = gethostbyname(nom);//roburc.ddns.net
	test(mahostent != NULL , "gethostbyname");
	struct in_addr addr;
 
	unsigned char v[4];
	int i=0,j=0;
	printf("Le nom de %s est %s et possede les adresses suivantes\n", nom,mahostent->h_name);
	while (mahostent->h_addr_list[i] != 0)
   	{
		  for(j=0;j<4;j++)
      		  	v[j] = (unsigned char)mahostent->h_addr_list[i][j];
		  sprintf(adresse , "%d.%d.%d.%d", v[0],v[1],v[2],v[3] );
		  printf("adresse %d : %s\n" , i , adresse);
 
		  i++;
	}
 
 
}
 
int main()
{
    SetConsoleOutputCP(UTF8);
    SetConsoleTitleA(DNS );
    //
	WSADATA WSAData;
    WSAStartup(MAKEWORD(2,0), &WSAData);
    //
	SOCKADDR_IN  serveur; // Br publique
	char buf[BUF_LENGTH];
	int j=0,i=0;
	// traitement pour BR serveur
	int descbrCli = socket(PF_INET, SOCK_STREAM,0);
	test(descbrCli,"ouverture socket");
	//
	char adresse[256] = "";
	getIp( "localhost", adresse);//"motamarid.ddns.net"
	//
	serveur.sin_family = AF_INET;
	serveur.sin_addr.s_addr = inet_addr(adresse);
	serveur.sin_port=htons((short)PORT);
	// envoi de demande de connexion au serveur
	int tailleServeur = sizeof(serveur);
	printf("Demande de connexion en cours...\n");
	int result = connect(descbrCli,(SOCKADDR *)&serveur,tailleServeur);
	test(result >= 0,"connexion avec le serveur");
	//
	fd_set tab;
	while(1)
	{
		FD_ZERO(&tab);
		FD_SET(descbrCli, &tab);
		FD_SET(0, &tab);
 
		//write(1,"parlez: ",sizeof("parlez: "));
		int ret = select(FD_SETSIZE, &tab, NULL, NULL, NULL);
		test(ret != SOCKET_ERROR,"select");
 
		if(FD_ISSET(0,&tab))
		{
                        printf("Ecriture!\n");
			fgets(buf, BUF_LENGTH-1, stdin);
			buf[strlen(buf)-1]='\0';
			int result = send(descbrCli,buf,BUF_LENGTH,0);
			//test(result,"send");
		}
		if(FD_ISSET(descbrCli, &tab))
		{
		    printf("Reception!\n");
			int recevoir = recv(descbrCli,buf,sizeof(buf),0);
			if(!recevoir)
			{
                                  closesocket(descbrCli);
                                  printf("déconnexion du serveur.\n");
                                  exit(EXIT_FAILURE);
			}
			//test(recevoir,"recv");
			printf("quelqu'un a dit: [%s].\n" , buf);
		}
 
	}
        WSACleanup();
	closesocket(descbrCli);
	return 0;
}
J'ai vraiment besoin d'aide j'ai passé toute la nuit dessus et la journée d'hier.