Actualmente estoy trabajando en una asignación de programación. La tarea es implementar un cliente, un emulador de red y un servidor. El cliente pasa los paquetes a un emulador de red y el emulador de red pasa al servidor. Viceversa también se aplica. El requisito previo para la asignación es que solo puedo usar conectores crudos. Así que crearé mis propios encabezados de IP y UDP. He probado mis paquetes con wireshark. Todos son correctos y están en el formato correcto (los lee correctamente).¿Cómo vincular un Socket Raw a un puerto específico?
Otro requisito es que el emulador, el cliente y el servidor tienen puertos específicos a los que deben estar vinculados. Ahora, no entiendo cómo vincular un socket sin formato a un puerto específico. Todos mis sockets sin procesar reciben todo el tráfico en la dirección de host a la que están vinculados. Según las páginas de manual, y en cualquier otro sitio en Internet, incluida la "Programación de red Unix" de Richard Stevens, así es como se supone que funcionan. Mi profesor no ha respondido a ninguno de mis correos electrónicos y probablemente no pueda preguntarle hasta el martes. Veo dos opciones frente a mí. Primero puedo usar libpcap para filtrar desde un dispositivo específico y luego enviarlo a mi socket sin procesar. Sin embargo, siento que esto está fuera del alcance de nuestra tarea. O puedo filtrarlos después de recibirlos del socket. Esto aparentemente tiene una sobrecarga porque todos los paquetes se están copiando/moviendo a través del kernel. Al menos, eso es lo que entiendo (por favor, siéntete libre de corregirme si estoy equivocado).
Así que mi pregunta es: ¿Es su una opción o algo que puedo configurar para esto? Donde el zócalo sin procesar se unirá a un puerto? ¿Me he perdido algo obvio?
Gracias por su tiempo.
-
Entonces, para asegurarme de que estoy interpretando esto correctamente, ¿no puedo enlazar a un puerto específico? Si ese es el caso, ¿cómo implementarías el "filtro"? Libérese a un dispositivo específico y filtre los puertos o, dado que esto es solo para una tarea, simplemente fíltrelos después de que el socket los reciba. ¿O quizás tienes una mejor manera de implementar en mente? Gracias por su respuesta y tiempo por cierto. – user614885
Ver la edición en mi respuesta. Creo que estás en el camino correcto. –
Un "puerto" es una construcción del protocolo de transporte. Desde el nivel de red (IP), los paquetes se dirigen a las direcciones. El trabajo de los protocolos de transporte de nivel superior es implementar la semántica de "puerto". Me imagino que tiene que decodificar los paquetes recibidos usted mismo, para determinar a qué "puerto" está dirigido y filtrar en consecuencia. – Santa