Bonjour a tous,
Je viens vers vous car j'ai une erreur incomprehensible, n'etant pas encore un expert des socket, je ne trouve pas la solution...
J'ai creer un serveur en ecoute qui creer un thread par client. Malheursement, impossible de continuer car le accept merdouille...
J'avais pourtant deja creer une version mono client qui marchait tres bien...
Voila mon code, mon main appel la fonction megatalk.
L'erreur est donc au niveau de l'accept qui me dit "accept() : Invalid argument"
Les fonction "xsocket()" "xaccept()" etc sont juste des "socket()" "accept()" mais avec des verifications d'erreurs.
st_client.h :
megatalk.c :
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 #ifndef ST_CLIENTS_H_ #define ST_CLIENTS_H_ #define MAX_SOCKET 5 typedef struct sockaddr_in SOCKADDR_IN; typedef const struct sockaddr SOCKADDR; typedef socklen_t SOCKLEN; typedef int SOCKET; typedef struct st_clients { pthread_t thread; SOCKET sock; SOCKADDR_IN sin; int sin_size; } st_clients; #endif /* ST_CLIENTS_H_ */
init_socket.c :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void megatalk(int server_port) { SOCKADDR_IN sin; SOCKET sock; sock = xsocket(AF_INET, SOCK_STREAM, 0); init_socket(sock, &sin, server_port); clients(sock, server_port); printf ("closing socket %d...\n", sock); close(sock); printf ("The socket is now closing\n"); }
clients.c :
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 void init_socket(SOCKET sock, SOCKADDR_IN *sin, int server_port) { struct protoent *proto; proto = getprotobyname("TCP"); /* On creer le socket */ sock = xsocket(AF_INET, SOCK_STREAM, proto->p_proto); printf ("socket %d is now opened in TCP/IP mode\n", sock); /* On remplit la struct du socket */ sin->sin_family = AF_INET; sin->sin_port = htons(server_port); sin->sin_addr.s_addr = htonl(INADDR_ANY); /* On nome le socket (On lui attribue une adresse) */ xbind(sock, (SOCKADDR *)sin, sizeof(*sin)); xlisten(sock, 5); printf("Listening on port %d...\n", server_port); }
Voila, j'espere que vous pourrez m'aider !
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 void clients(SOCKET sock, int server_port) { st_clients *s_client; while (42) { printf("waiting for a client connection on port %d...\n", server_port); s_client = my_xmalloc_bzero(sizeof(*s_client)); s_client->sin_size = sizeof(s_client->sin); s_client->sock = xaccept(sock, (struct sockaddr *)&s_client->sin, (SOCKLEN *)&s_client->sin_size); printf("client connected with socket %d from %s:%d\n", s_client->sock, inet_ntoa(s_client->sin.sin_addr), htons(s_client->sin.sin_port)); /* Thread creation */ pthread_create(&s_client->thread, NULL, client_thread, s_client); s_client = NULL; } }
En tout cas merci par avance, et si vous avez des commentaire sur le code (et a mon avis il doit y en avoir :p) dites le moi !
Akiat.
PS: Desole pour l'accentuation: clavier QWERTY...
Partager