Article View: es.comp.os.linux.programacion
Article #1266Re: Usar un socket UDP con origen y destino
From: Oscar Garcia
Date: Tue, 27 Dec 2005 18:45
Date: Tue, 27 Dec 2005 18:45
114 lines
5847 bytes
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-mailReferences:
<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