Article View: es.comp.os.linux.programacion
Article #1264Usar un socket UDP con origen y destino
From: Marc Franquesa
Date: Tue, 27 Dec 2005 15:08
Date: Tue, 27 Dec 2005 15:08
75 lines
3655 bytes
3655 bytes
Para una de esas cosas 'raras' de practicas debo implementar algo parecido a un protocolo orientado a conexión sobre UDP. Para eso he creado mi propio protocolo encima de UDP, però mi problema viene con la gestión de los sockets: Esta es la situación: 1) Un cliente que se conecta a 127.0.0.1:10000 Para tal conexión hago un socket() y luego un connect(), que aunque UDP no sea orientado a conexión hace que sólo envie y reciba del host al que me conecto. 2) Un servidor que 'escucha' en el puerto 127.0.0.1:10000 Para eso sólo hago un bind() al puerto 10000 y luego reads hasta que reciba la petición de conexión en mi capa (por encima de UDP). Dado que UDP no és orientado no necesito (ni puedo, ni debo) hacer ni un listen() ni ningún accept(). El socket() y bind() funcionan, ya que mi capa en el servidor al que he hecho bind() recibe los paquetes correctamente. Mi problema: Una vez mi capa ha leído y accpetado como correcto lo que he recibido en el socket del servidor, debo poder comunicarme con ese cliente. El problema aquí és que el socket del servidor no está 'conectado' (es UDP), por lo que cada vez que envie debo especificar el destino con sendto(). Aquí no hay demasiado problema, pero como hago para 'recibir' _SÓLO_DE_ESE_CLIENTE ? recvfrom no sirve para eso. Además cliente y servidor comparten el código de mi capa, con lo que debo usar la misma llamada (write/sendto) en ambos (no es demasiado problema). Una opción que se me ha ocurrido es conectar también el socket del servidor. De esta forma hago un connect() al cliente que me ha solicitado la conexión y me olvido de direcciones usando sólo (read/write). El problema és que debo mantener la dirección local de origen, ya que és la que usa el cliente para comunicar-se conmigo, però me da un 'Address already in use'. Lo que no entiendo, ya que creía que esto sólo passava al haber hecho un listen(). ¿Cómo se hace para escoger dirección de origen y de destino? ¿No debería ser con un bind() y un connect() ? Espero haber-me explicado que alguien más lumbreras que yo me diga dónde está mi error (que probablemente es mas de enfoque que de implementación) Muchas gracias. Por cierto: ¿Alguien sabe si hay alguna mètodo para definir un protocolo nuevo al Ethereal y facilitarme aún más la tarea? Ya puestos y que es Navidad (Feliz Navidad y año nuevo)
Technical Details
Message-ID:
<1135696121.15210.14.camel@localhost.localdomain>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news4.google.com!news.glorb.com!news.antakira.com!guada07.guadawireless.net!reboot.escomposlinux.org!escomposlinux.org!news-3.escomposlinux.org!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Thread: f86c8,e630809bf4f9f23d,start X-Google-Attributes: gidf86c8,public X-Google-Language: SPANISH,UTF8 Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news4.google.com!news.glorb.com!news.antakira.com!guada07.guadawireless.net!reboot.escomposlinux.org!escomposlinux.org!news-3.escomposlinux.org!not-for-mail From: Marc Franquesa <mark@l3jane.net> Newsgroups: es.comp.os.linux.programacion Subject: Usar un socket UDP con origen y destino Date: Tue, 27 Dec 2005 16:08:42 +0100 Organization: Lady 3Jane Lines: 80 Message-ID: <1135696121.15210.14.camel@localhost.localdomain> NNTP-Posting-Host: 171.red-80-36-170.staticip.rima-tde.net Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Trace: news-3.escomposlinux.org 1135696123 32101 80.36.170.171 (27 Dec 2005 15:08:43 GMT) X-Complaints-To: reboot@escomposlinux.org NNTP-Posting-Date: Tue, 27 Dec 2005 15:08:43 +0000 (UTC) X-Mailer: Evolution 2.4.1