Клиент Socket с помощью Select

Я пытаюсь реализовать клиентскую функцию, которая может установить соединение с несколькими серверами с помощью функции select() . Но я не эксперт в использовании функции select() . Однако мой клиент может включить соединение с несколькими серверами, но он не сможет читать сообщения с этих нескольких серверов.

В моем следующем примере я подключил свой клиент с двумя серверами ( 192.168.100.136, 192.168.100.138) . После подключения к этим двум серверам мой клиент получал сообщения только с одного сервера ( 192.168.100.136 ) вместо приема сообщений с нескольких серверов.

Я не уверен в том, как я использовал функцию select() в моей примерной программе. Пожалуйста, исправьте мое примерное приложение, чтобы получить желаемый о / р. Спасибо заранее

 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 ; } в 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 ; } , 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 ; } 

Перед каждым использованием fd_set необходимо инициализировать.

Ваш код должен выглядеть так:

 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 ; } в 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 ; } , 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 ; }