| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
kunta41 Cdt

Registrado: 29 Ene 2007Mensajes: 22
|
Publicado: Vie 29 Abr, 2016 9:09 am Asunto: Elegir puerto local en TClientsocket |
|
|
Hola:
Estoy utilizando el componente TClientSocket y me conento con el sevidor sin problemas.
He encontrado un servidor que comprueba que el cliente mande las peticiones por un puerto determinado y si no las rechaza.
He estado buscando y parece que con la funcion bind() se puede realizar, pero no se como funciona. ¿me podriais ayudar?
El problema es asignar un puerto determinado en el cliente para hacer las peticiones.
Gracias |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 04 May, 2016 12:15 am Asunto: |
|
|
bind es para el servidor a bajo nivel.
No puedes cambiar el puerto de un TClienntSocket mientras esté conectado, pero si puedes hacer esto:
| Código: |
ClientSocket1->Close();
ClientSocket1->Port = 1;
ClientSocket1->Open();
|
Saludos. |
|
| Volver arriba |
|
 |
kunta41 Cdt

Registrado: 29 Ene 2007Mensajes: 22
|
Publicado: Mar 10 May, 2016 2:22 pm Asunto: |
|
|
Muchas gracias por tu respuesta, pero con la solucion que propones se asigna el puerto remoto al que quieres conectarte.
Mi pregunta es como se puede asignar el puerto desde el pc donde estas corriendo el programa.
Con el componente TClienntSocket asignas la direccion IP donde quieres conectarte, el puerto del servidor donde quieres realizar la conexion y yo quiero configurar el puerto de mi pc desde donde quiero realizar la conexion.
Un saludo |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 11 May, 2016 12:31 am Asunto: |
|
|
Un puerto no es remoto o local, no es una dirección. Debes configurar el mismo puerto en el cliente y en el servidor. En el protocolo TCP el servidor se pone a la escucha en un determinado puerto, cuando un cliente accede a la IP del servidor en ese puerto, el servidor acepta, o no la conexión. Si se establece conexión, empieza la comunicación. El servidor asocia un puerto a su socket mediante la función bind (a bajo nivel). El protocolo UDP no requiere conexión previa.
El cliente siempre debe usar el puerto por el que escucha el servidor.
Si lo que pretendes es conectarte a un servidor que se encuentra en un PC, debes asignar a tu cliente la dirección IP Localhost (127.0.0.1) y el puerto correspondiente por el que escucha el servidor localizado en tu PC.
Saludos. |
|
| Volver arriba |
|
 |
kunta41 Cdt

Registrado: 29 Ene 2007Mensajes: 22
|
Publicado: Mie 11 May, 2016 6:22 am Asunto: |
|
|
Otra vez muchas gracias por tu respuesta.
He comprobado que el cliente TCP del builder realiza la conexión por un puerto diferente al del servidor que se quiere conenectar. Si configuramos:
ClientSocket1->1;
Nos referimos a que queremos conectarnos al puerto 1 del servidor con la direccion IP que hayamos configurado, pero no significa que el cliente este utilizando ese puerto para realizar la conexión.
Este "problema" con el builder lo habia escuchado antes y no sabia si se habia solucionado.
Muchas gracias |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 11 May, 2016 5:54 pm Asunto: |
|
|
Nunca tuve el problema de que al asignar el puerto luego no sea ese puerto., en cualquier caso y por si tu versión tuviese un bug, deja en fase de diseño el puerto y dirección apropiada, la propiedad active = false. Para evitar conflictos y si quieres que la conexión se realice de forma automática, coloca un timer con untervalo 1000. y deshabilitado.
En el constructor de tu formulario, habilita el timer.
En el evento del timer:
| Código: |
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
ClientSocket1->Por = MIPUERTO;
ClientSocket1->Address = MIDIRECCION;
ClientSocket1->Active = true;
ClientSocket1->Open();
}
|
Esto asegura por código que la dirección y puerto son apropiadas antes de intentar la conexión.
En lugar de un timer puedes usar un botón, si quieres que la conexión no sea automática al iniciar tu formulario.
Saludos. |
|
| Volver arriba |
|
 |
kunta41 Cdt

Registrado: 29 Ene 2007Mensajes: 22
|
Publicado: Jue 12 May, 2016 6:42 am Asunto: |
|
|
Gracias escafranda por tu respuesta.
Quizas me estoy explicando mal, con
ClientSocket1->Port = 111;
me conecto perfectame al puerto remoto del server, lo que quiero es conectarme a traves de un puerto determinado de mi pc
ejemplo:
cliente servidor
IP 192.168.1.1 IP 192.168.1.2
Puerto: 222 Puerto 111
Quiero conectar el cliente con el servidor y me conecto bien, pero lo que no consigo es realizar la conexion por el puerto 222 del cliente. El buider coge un puerto aleatorio no el que quiero que sea (en el caso del ejemplo el 222)
Muchas gracias |
|
| Volver arriba |
|
 |
kunta41 Cdt

Registrado: 29 Ene 2007Mensajes: 22
|
Publicado: Jue 12 May, 2016 8:27 am Asunto: |
|
|
Edito otra vez para que se vea mejor el ejemplo
cliente servidor
IP 192.168.1.1 IP 192.168.1.2
Puerto: 222 Puerto 111 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 12 May, 2016 12:36 pm Asunto: |
|
|
No puedes conecterte por un puerto distinto al servidor. Tanto cliente como servidor deben estar en el mismo puerto.
Si quieres otro puerto debes cambiar tanto cliente como servidor.
Saludos. |
|
| Volver arriba |
|
 |
kunta41 Cdt

Registrado: 29 Ene 2007Mensajes: 22
|
Publicado: Vie 13 May, 2016 6:57 am Asunto: |
|
|
Muchas gracias escafandra por tus respuestas.
Un saludo |
|
| Volver arriba |
|
 |
|