Socket de servidor: acepte conexiones solo desde direcciones IP en la lista blanca

Tengo un servidor de socket que escucha y acepta conexiones del cliente, que funciona de la siguiente manera:

... do some pre-processing (socket, binds, etc) //listen to client if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } printf("server: waiting for connections...\n"); while(1) { // main accept() loop sin_size = sizeof client_addr; new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); if (new_fd == -1) { perror("accept"); continue; } //do something ..... ..... } 

¿Cómo puedo restringir el servidor para que solo acepte la conexión de direcciones IP específicas? Por ejemplo, puedo crear un archivo de texto que contenga una lista blanca de direcciones IP para aceptar, en el siguiente formato:
202.168.2.5 – 202.168.2.127
92.104.3.1 – 92.104.4.254
//y así

Básicamente, quiero rechazar la conexión de todas las direcciones IP no incluidas en la lista blanca. Si la API de la biblioteca de sockets no es compatible con esto, estoy de acuerdo con la idea de aceptar las conexiones primero, luego cierre inmediatamente el socketfd si la peeraddress no está en la lista blanca. Pero, ¿cómo realizar esto? ¿Cómo puedo verificar que una dirección IP específica se encuentre dentro del rango especificado en mi lista blanca? Cualquier ejemplo sería apreciado.

Desea llamar a getpeername para obtener la información de la dirección del cliente. A continuación, compruebe si su dirección IP se encuentra en la lista blanca. Si no, desconéctelos.

Para verificar que su dirección IP se encuentra dentro de un rango determinado, desea convertir los bytes de dirección en un número. Puedes hacer eso con lo siguiente:

 unsigned int n = bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3]; 

Si el límite inferior del rango de direcciones es A, y el límite superior es B y la dirección IP del cliente es X, entonces están en la lista blanca if (A <= X && X <= B) .

Si cada rango de direcciones IP prueba falso, no están en la lista blanca y debe desconectarlos.

No estoy seguro de cuál es la pregunta aquí, o más bien cuál es el problema. La dirección del cliente estará en their_addr , así que solo busque en su lista blanca para eso. Si no lo encuentra, cierre. Probablemente querrá convertir their_addr al mismo formato que sus entradas en la lista blanca, o posiblemente viceversa.

Solo en Windows, puede usar WSAAccept() lugar de accept() . WSAAccept() tiene un parámetro al que puede pasar una función de callback. Antes de aceptar una nueva conexión, se invoca la callback con las direcciones y los valores de QOS para esa conexión. La callback puede devolver CF_ACCEPT , CF_DEFER o CF_REJECT según sea necesario.