Socket client using Select

J’essaie d’implémenter une fonction client qui peut établir une connexion avec plusieurs serveurs à l’aide de la fonction select() . Mais je ne suis pas un expert dans l’utilisation de la fonction select() . Cependant, mon client peut activer une connexion avec plusieurs serveurs, mais il n’a pas pu lire les messages de ces serveurs.

Selon mon exemple suivant, j’ai connecté mon client avec deux serveurs ( 192.168.100.136, 192.168.100.138) . Une fois connecté à ces deux serveurs, mon client recevait des messages d’un seul serveur ( 192.168.100.136 ) au lieu de recevoir des messages de plusieurs serveurs.

Je ne suis pas sûr de la façon dont j’ai utilisé la fonction select() dans mon exemple de programme. S’il vous plaît corriger mon exemple d’application pour obtenir le o / p souhaité .. Merci d’avance

 int main() { int port = 10001 ; char ip[][32] = {"192.168.100.136","192.168.100.138"}; int count = 2 ; int ret = clientSelect(ip,port,count); return 0 ; } int clientSelect(char **ipAddr ,int port , int count) { SOCKET max_sd = 0; SOCKET socketId[10] = {0}; SOCKET sd = 0 ; SOCKET client_sock[1024] = {0} ; fd_set readfds; int i ,j , ret; char recvBuf[1024] = ""; char errMsg[256] = "" ; struct sockaddr_in server ; FD_ZERO(&readfds); // Socket Initialization for(i = 0; i<count ; i++) { ret = initSocket(&socketId[i]);//Small function to create socket if (ret != 1) { return ret ; } //Server info server.sin_addr.s_addr = inet_addr(ipAddr[i]); server.sin_family = AF_INET; server.sin_port = htons(port); // Conect to server if (connect(socketId[i], (struct sockaddr *)&server , sizeof(server)) socketId[i])?max_sd:socketId[i]; } while(TRUE) { ret = select(max_sd + 1, &readfds, NULL, NULL, NULL); if (ret < 0) { printf("select failed\n "); return -1; } for ( j = 0 ; j 0 ) { printf("Message received from socket %d : %s\n",sd,recvBuf); send(sd,(char *)recvBuf,strlen(recvBuf),0); } } } } return ret ; } 

Le fd_set doit être initialisé avant chaque utilisation.

Votre code devrait être comme:

 int clientSelect(char **ipAddr ,int port , int count) { SOCKET max_sd = 0; SOCKET socketId[10] = {0}; SOCKET sd = 0 ; fd_set readfds; int i ,j , ret; char recvBuf[1024] = ""; char errMsg[256] = "" ; struct sockaddr_in server ; // Socket Initialization for(i = 0; isocketId[i])?max_sd:socketId[i]; } ret = select(max_sd + 1, &readfds, NULL, NULL, NULL); if (ret < 0) { printf("select failed\n "); return -1; } // warning: you don't know the max_sd value for(i = 0; i 0 ) { printf("Message received from socket %d : %s\n",sd,recvBuf); send(sd,(char *)recvBuf,strlen(recvBuf),0); } } } } return ret ; }