Article View: es.comp.os.linux.programacion
Article #1267Re: Usar un socket UDP con origen y destino
From: Count Zero
Date: Wed, 28 Dec 2005 11:07
Date: Wed, 28 Dec 2005 11:07
125 lines
6587 bytes
6587 bytes
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 En/na Oscar Garcia ha escrit: > 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). Te recurdo que me intento es 'emular' un protocolo orientado a conexi�n. A�n as� de tu comentario deduzco que con un bind() y luego un connect() puedo elegir direcci�n y puerto local y remotos tanto en UDP como en TCP. Se puede as�? > 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. Si ya lo s�, pero uso el connect() precisamente por qu� me garantiza que la capa UDP s�lo leear� paquetes enviadados des del extremo al que me he 'conectado' aunque UDP no sea orientado a conexi�n. Eso me ahorra tener que usar recvfrom() o sendto() por ejemplo. > Pero deber�as implementar una capa en tu protocolo que abstraiga los > m�todos bind, connect, etc usando paquetes UDP. Y as� lo he echo. > 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. (Supongo que con 'callback' indicas algo tipo el SYN+ACK del TCP, que es similar a lo que yo hago.) Precisamente en este punto es donde tengo problemas: Una vez el servidor ha acceptado (y notificado al cliente) la 'conexi�n', el cliente ya puede transmitir y recibir sin problemas, ya que el socket ya est� "conectado" al servidor. Pero el servidor en ese momento s�lo dispone de un socket UDP associado localmente mediante bind() que, aqu� mi problema, RECIBE DE QUALQUIER CLIENTE. Por lo tanto necesito un m�todo para distinguir diversos clientes (flujos), y como muy bien apunta I�aki, UDP no tiene concepto de flujo por lo que me las debo apa�ar yo. Mi idea era intentar emular el accept() de TCP m�s o menos as�: - - Una vez acceptada la conexi�n el servidor creo un nuevo socket - - Con bind() lo associo al puerto local donde doy servicio (que �s por d�nde el cliente me enviar� datagramas). - - Con connect() lo associo al cliente que ha pedido la conexi�n. Aunque UDP no �s orientado, eso me garantiza que S�LO RECIBIR� DATAGRAMAS DE ESE CLIENTE (man dixit) > 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). Ya tengo esa estructura, s�lo que hasta el momento intentaba evitar tener que almacenar esa informaci�n, pero veo que ya va siendo hora de que toque de pies al suelo y lo haga. > Entonces estar�as usando TCP y no UDP. No, la llamada socket() especifica el tipo de protocolo via SOCK_DGRAM o SOCK_STREAM, connect() y bind() no hacen nada al respecto. (Mira las p�ginas de man) > 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. Ten�a entendido (quiz� me equivoco) que el sistema identifica una conexi�n/socket por la tupla direcci�n-local:puerto-local/direcci�n-remota:puerto-remoto, por lo que cre�a que podr�a hacer el bind() a�n y ya tener un socket en ese puerto, pero se queja con el error "Address already in use", por lo que debo destimar este enfoque. > En UDP se especifica en el sendto directamente. En el sendto() no hay problema: YO digo al sistema D�NDE enviar. El problema �s con recvfrom(), el SISTEMA me dice de D�NDE he recibido, cuando yo lo que quiero �s poder indicar-le de que direcci�n deseo recibir. Evidentemente puedo recibir y luego "separar" el flujo seg�n la direcci�n remota, pero esto complica mucho el c�digo. Tambi�n havia pensado en usar MSG_PEEK, para dejar el datagrama en la cola caso de no interessarme, per� no lo veo muy fiable para m�s intereses. > Sinceramente no me ha quedado muy claro lo que deseas conseguir. Lo s� > 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. Exactamente esto! > Si te explicas un poco mejor la verdad que lo agradeceremos. Espero haverlo hecho, a�n as� los comentarios me han hecho ver lo que tem�a: iba por mal camino. Pero pens� que quiz� alguien ver�a una forma m�s simple de hacerlo. Muchas gracias. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDsnHh4CVRFTc6wP8RAgmVAJ9/GXdFfy/dAHCcIfqO/555srOsIwCfRPid 1SY3+yUAb/tZ8ult9bv2ri8= =XLNT -----END PGP SIGNATURE-----
Technical Details
Message-ID:
<dotrl1$i1m$1@news-3.escomposlinux.org>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news3.google.com!news.glorb.com!news.antakira.com!mainake.escomposlinux.org!reboot.escomposlinux.org!escomposlinux.org!news-3.escomposlinux.org!not-for-mailReferences:
<1135696121.15210.14.camel@localhost.localdomain> <5023r1dmnimoopu4cmtg10f8v3qtp4n0if@4ax.com>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!news3.google.com!news.glorb.com!news.antakira.com!mainake.escomposlinux.org!reboot.escomposlinux.org!escomposlinux.org!news-3.escomposlinux.org!not-for-mail From: Count Zero <mark@l3jane.net> Newsgroups: es.comp.os.linux.programacion Subject: Re: Usar un socket UDP con origen y destino Date: Wed, 28 Dec 2005 12:07:13 +0100 Organization: ecolnet Lines: 125 Message-ID: <dotrl1$i1m$1@news-3.escomposlinux.org> References: <1135696121.15210.14.camel@localhost.localdomain> <5023r1dmnimoopu4cmtg10f8v3qtp4n0if@4ax.com> NNTP-Posting-Host: 171.red-80-36-170.staticip.rima-tde.net Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: news-3.escomposlinux.org 1135768034 18486 80.36.170.171 (28 Dec 2005 11:07:14 GMT) X-Complaints-To: reboot@escomposlinux.org NNTP-Posting-Date: Wed, 28 Dec 2005 11:07:14 +0000 (UTC) User-Agent: Mozilla Thunderbird 1.0.7 (X11/20051013) X-Accept-Language: ca In-Reply-To: <5023r1dmnimoopu4cmtg10f8v3qtp4n0if@4ax.com> X-Enigmail-Version: 0.92.0.0