🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #1264

Usar un socket UDP con origen y destino

#1264
From: Marc Franquesa
Date: Tue, 27 Dec 2005 15:08
75 lines
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-mail

Show 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