🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Usar un socket UDP con origen y destino

#1266
From: Oscar Garcia
Date: Tue, 27 Dec 2005 18:45
114 lines
5847 bytes
El Tue, 27 Dec 2005 16:08:42 +0100, Marc Franquesa <mark@l3jane.net>
escribi�:
>Para una de esas cosas 'raras' de practicas debo implementar algo
>parecido a un protocolo orientado a conexi�n sobre UDP.

Es reinventar la rueda, pero veamos como te las apa�as :)

>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:

Veamosla.

>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.

No hombre. Con socket creas las estructuras asociadas al socket que
est�s creando. Para conectarte a una m�quina remota no necesitas un
"connect", ni siquiera un "bind" (que ser�a necesario en caso de que
no quieras que el SO elija por t� ip y puerto local).

Con UDP como cliente basta con rellenar los campos de la estructura
socket y en sendto y recvfrom dar como par�metro una estructura que
ser� rellenada con los datos del host remoto que nos transmite tanto
por nosotros mismos para indicar al host con el que queremos
comunicarnos.

>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.

Pero deber�as implementar una capa en tu protocolo que abstraiga los
m�todos bind, connect, etc usando paquetes UDP.

Lo normal es enviar un paquete UDP solicitando la conexi�n y que tu
aplicaci�n la permita o la rechace no sin antes pasarle mediante un
callback a la aplicaci�n interesada que dicha conexi�n se ha
producido.

>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.

Debes crearte una estructura a nivel de tu aplicaci�n que guarde todos
los valores de ambos extremos una vez que se haya terminado el proceso
de establecimiento de conexi�n. Esto implica que todo lo tendr�s
previamente almacenado en memoria (los sockaddr_in del otro extremo,
por ejemplo).

>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).

�Cual es la duda?

>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).

Entonces estar�as usando TCP y no UDP.

>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(). 

A ver. Eso es posiblemente porque has hecho un bind y has ocupado un
puerto local y/o ip local para enviar datos, de modo que no se puede
usar ese mismo puerto para enviar m�s datos.

>�C�mo se hace para escoger direcci�n de origen y de destino? �No deber�a
>ser con un bind() y un connect() ?

En UDP se especifica en el sendto directamente.

>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)

Sinceramente no me ha quedado muy claro lo que deseas conseguir.

En un principio pens� que deseas implementar (quiz� para un trabajo de
la universidad) una capa de transporte de datos orientado a conexi�n
haciendo uso de una capa inferior no orientada a conexi�n.

Luego m�s bien parece que lo que deseas es establecer un protocolo
abstracto (que no entiendo demasiado bien) en el que deseas
simplemente comunicar dos aplicaciones usando unas funciones sencillas
y que se almacenen autom�ticamente los datos locales y remotos.

Si te explicas un poco mejor la verdad que lo agradeceremos.

>>Ya puestos y que es Navidad (Feliz Navidad y a�o nuevo)

FELIZ NAVIDAD, A�O 2006 Y A�OS VENIDEROS.

Un saludo.

-- 
�scar Javier Garc�a Baudet
LinaresDigital
http://redstar.linaresdigital.com/
Technical Details
Message-ID: <5023r1dmnimoopu4cmtg10f8v3qtp4n0if@4ax.com>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news4.google.com!news.glorb.com!news.musoftware.de!news-15.escomposlinux.org!cernicalo.escomposlinux.org!escomposlinux.org!not-for-mail
References: <1135696121.15210.14.camel@localhost.localdomain>

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,e630809bf4f9f23d
X-Google-Attributes: gidf86c8,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news4.google.com!news.glorb.com!news.musoftware.de!news-15.escomposlinux.org!cernicalo.escomposlinux.org!escomposlinux.org!not-for-mail
From: Oscar Garcia <redstarQUITARSPAM23@terra.es>
Newsgroups: es.comp.os.linux.programacion
Subject: Re: Usar un socket UDP con origen y destino
Date: Tue, 27 Dec 2005 19:45:55 +0100
Organization: Ecolnet
Lines: 114
Message-ID: <5023r1dmnimoopu4cmtg10f8v3qtp4n0if@4ax.com>
References: <1135696121.15210.14.camel@localhost.localdomain>
NNTP-Posting-Host: 62-14-93-178.inversas.jazztel.es
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
X-Trace: cormoran.emeteo.local 1135709153 10282 62.14.93.178 (27 Dec 2005 18:45:53 GMT)
X-Complaints-To: emeteo@escomposlinux.org
NNTP-Posting-Date: Tue, 27 Dec 2005 18:45:53 +0000 (UTC)
X-Newsreader: Forte Free Agent 2.0/32.652