MultiSocket Listening Linux Socket Programing

Este es un código simple que he escrito. El servidor responde a las CONEXIONES EN LOS PUERTOS 2923, 2924 y 2925.

Cuando ejecuto el progtwig, el servidor solo se conecta a CONEXIÓN desde el PUERTO 2923. ¿Puede alguien ayudarme? Gracias

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  void handle_client(int cliend_fd) { int ret = accept(cliend_fd, NULL, 0); if (ret < 0) { printf("Accept Error\n"); } else { printf("Client Accepted\n"); shutdown(ret, 2); } } int main() { int count = 3; int PORT = 2923; struct sockaddr_in address; int MasterSocket[count]; int i = 0; fd_set readfds; int maxfd; maxfd = -1; int SelectSession; struct timespec TimeOut; TimeOut.tv_sec = 2; TimeOut.tv_nsec = 2; for (i = 0; i < count; i++) { MasterSocket[i] = socket(AF_INET, SOCK_STREAM, 0); } for (i = 0; i < count; i++) { address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("127.0.0.1"); address.sin_port = PORT + i; if (bind(MasterSocket[i], (struct sockaddr *) &address, sizeof(address)) < 0) { perror("Bind\n"); getchar(); } printf("SockerDesriptor %d---bind %d\n", MasterSocket[i], PORT + i); } for (i = 0; i < count; i++) { if (listen(MasterSocket[i], 4) < 0) { perror("Listen"); getchar(); //return 1; } else { printf("Listening on Port %d---\n", PORT + i); } } while (1) { FD_ZERO(&readfds); int status; for (i = 0; i  maxfd) { maxfd = MasterSocket[i]; } printf("%d Added to FD_SET Descriptor %d \n\n", PORT + i, MasterSocket[i]); } //status = 0; printf("############Waiting for Connection\n"); status = pselect(maxfd + 1, &readfds, NULL, NULL, &TimeOut, NULL ); if (status < 0) { perror("Status"); getchar(); return 1; } else if (status == 0) { printf("TimeOut occured\n"); } else { //printf("Status %d\n", status); SelectSession = -1; for (i = 0; i < count; i++) { //printf("Checking Set %d\n", i); if (FD_ISSET(MasterSocket[i], &readfds)) { //printf("Matching Set %d\n", i); SelectSession = MasterSocket[i]; printf("SelectSession %d\n", MasterSocket[i]); if (SelectSession == -1) { //shutdown (MasterSocket[i], 2); //continue; break; } else { printf("In Handle\n"); handle_client(SelectSession); getchar(); } } else { printf("Not in FD_ISSET\n"); } } } /*for (i=0; i<count; i++) { shutdown (MasterSocket[i], 2); } */ } return 0; } 

Retire el getchar() de while loop.

Después de pselect servidor, espera recibir un personaje, por lo que no permite que el cliente se conecte más.

O debe ingresar un carácter en el servidor después de cada cliente conectado

Y cambie el número de puerto a orden de bytes de red usando htons

Progtwig:

 #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  void handle_client (int cliend_fd) { int ret = accept(cliend_fd, NULL, 0); if ( ret < 0 ) printf("Accept Error\n"); else { printf ("Client Accepted\n"); shutdown (ret, 2); } return; } int main() { int count = 3, PORT = 8000, opt = 1, i = 0; int MasterSocket[count]; int maxfd = -1, SelectSession; fd_set readfds; struct sockaddr_in address; struct timespec TimeOut; TimeOut.tv_sec = 2; TimeOut.tv_nsec = 2; for(i=0; i maxfd) maxfd = MasterSocket[i]; } status = pselect(maxfd + 1, &readfds, NULL, NULL, &TimeOut, NULL ); if(status < 0) perror("Status"); /* else if(status == 0) printf("TimeOut occured\n"); */ else if(status > 0) { for (i = 0; i < count; i++) { if (FD_ISSET(MasterSocket[i], &readfds)) { SelectSession = MasterSocket[i]; printf("SelectSession %d\n", MasterSocket[i]); handle_client(SelectSession); //getchar(); } } } } return 0; } 

Esta línea

  address.sin_port = PORT + i; 

debiera ser

  address.sin_port = htons(PORT + i); 

para asegurarse de que el puerto se almacena en orden de bytes de la red.


También debe close() un descriptor de socket después de haberlo cerrado, si no lo necesita más, para liberar los recursos del sistema asociados con él.