Bonjour a tous!
J'ai un petit souci avec mes sockets Windows. Lorsque j'ouvre mes ports orange, que je mets les bonnes IP (ip du pc sur le serveur et ip publique sur le client), que je lance le serveur et que je me connecte avec le client, le client reçoit bien un message ("quel est votre nom et votre age"), mais le serveur quant à lui, ne reçoit aucune donnée de la part du client (mais m'affiche bien que le client s'est connecté). J'ai essayé le même programme avec l'ipv4 de mon pc sur les deux .c et testé avec mon ordi et un autre (sur la même co) et ça fonctionne très bien. (Et sans l'autorisation du port, le client ne se connecte pas du tout donc ça m'étonnerait que le problème vienne de l'ouverture de port). J'ai aussi essayé de désactiver intégralement mon antivirus et désactiver les pare-feu orange (choisir le niveau de sécurité: faible) sans succès.
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 //serveur #include<windows.h> #include<unistd.h> #include <winsock2.h> #include <ws2tcpip.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include <pthread.h> typedef struct User { char nom[30]; int age; }User; void *function(void *arg) { int socket = *(int*)arg; char msg[] = "quel est votre nom et votre age"; User user; send(socket, msg, strlen(msg)+1, 0); recv(socket, &user, sizeof(user), 0); printf("le client s'appelle %s et a %d ans\n", user.nom, user.age); close(socket); free(arg); pthread_exit(NULL); } int main(void) { setbuf(stdout, NULL); setbuf(stderr, NULL); WSADATA WSAData; if(WSAStartup(MAKEWORD(2, 0), &WSAData)) { printf("WSA n'a pas pu être initialisé.\n"); } int socketServer = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrServer; memset(&addrServer, 0, sizeof (addrServer)); addrServer.sin_addr.s_addr = inet_addr("192.168.1.38"); addrServer.sin_family = AF_INET; addrServer.sin_port = htons(30000); bind(socketServer, (const struct sockaddr *)&addrServer, sizeof(addrServer)); printf("bind: %d\n", socketServer); listen(socketServer,4); printf("listen\n"); pthread_t threads[4]; for(int i=0; i<4; i++) { struct sockaddr_in addrClient; socklen_t csize = sizeof(addrClient); int socketClient = accept(socketServer, (struct sockaddr *)&addrClient, &csize); printf("accept\n"); printf("client: %d\n", socketClient); int *arg = malloc(sizeof(int)); *arg = socketClient; pthread_create(&threads[i], NULL, function, arg); } for(int i=0; i<4; i++) { pthread_join(threads[i], NULL); } close(socketServer); printf("Close\n"); WSACleanup(); return 0; }Quelqu'un pourrait-il m'expliquer pourquoi ça ne fonctionne pas?
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 //client #include<windows.h> #include<unistd.h> #include <winsock2.h> #include <ws2tcpip.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include <pthread.h> typedef struct User { char nom[30]; int age; } User; int main(void) { setbuf(stdout, NULL); setbuf(stderr, NULL); WSADATA WSAData; if(WSAStartup(MAKEWORD(2, 0), &WSAData)) { printf("WSA n'a pas pu être initialisé.\n"); } int socketClient = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addrClient; memset(&addrClient, 0, sizeof (addrClient)); addrClient.sin_addr.s_addr = inet_addr("90.70.0.168"); addrClient.sin_family = AF_INET; addrClient.sin_port = htons(30000); connect(socketClient, (const struct sockaddr *)&addrClient, sizeof(addrClient)); printf("connecte\n"); /******action*******/ User user; char msg[33]; recv(socketClient, msg, 32, 0); printf("%s\n", msg); scanf("%s %d", user.nom, &user.age); send(socketClient, (void *)&user, sizeof(user), 0); /***************/ close(socketClient); WSACleanup(); return 0; }
Merci à tous!
Partager