problema con sockets
Ralil Ayancan Guillermo (Casa Matriz)
GRalil en codelco.cl
Mie Dic 20 15:19:22 CLST 2006
> -----Mensaje original-----
> De: linux-bounces en listas.inf.utfsm.cl [mailto:linux-
> bounces en listas.inf.utfsm.cl] En nombre de juan pablo Rumie Vittar
> Enviado el: Miércoles, 20 de Diciembre de 2006 10:44
> Para: linux en listas.inf.utfsm.cl
> Asunto: problema con sockets
>
> El Date: Fri, 15 Dec 2006 18:02:25, "Simon Norambuena"
> <crazy_man12 en hotmail.com>, escribio:
>
> > Hola lister en s:
> > tengo una consulta que al parecer tiene que ver con
> > C y Linux.
> > Estoy desarrollando en C una aplicación cliente -
> > servidor, donde el cliente
> > tiene windows xp y el servidor tiene linux O.S. red
> > hat con dos tarjetas de
> > red una pci y otra pcmcia , y se comunican entre sí
> > a traves de un socket.
> > El problema está en que cuando abro el socket en el
> > servidor y lo pongo en
> > modo escucha y luego hago que acepte las conexiones
> > del cliente cuando se
> > conecte, no pasa nada, no recibe datos. Luego de
> > calentarme la cabeza un
> > buen rato lo siguiente me llamo la atención, la
> > tarjeta eth0 tiene ip
> > 192.168.1.189 y la tarjeta de red eth1 (que es la
> > que se conecta con el
> > cliente) tiene ip 192.168.2.2 por lo cual en el
> > codigo del servidor puse lo
> > siguiente
> >
> > server.sin_addr.s_addr = inet_addr("192.168.2.2");
> >
> > donde server es una estructura del tipo "struct
> > sockaddr_in". la cosa es que
> > cuando ejecuto la aplicación y hago un netstat -n o
> > netstat -a, veo
> > solamente que tiene abierto puertos en la ip
> > 192.168.1.189, ya que muestra
> > una lista con
> >
> > 192.168.1.189:puerto "Listening"
> >
> > entonces no sé por qué no abre el puerto que pido en
> > la IP 192.168.2.2 que
> > es la que se conecta con el cliente. Cabe destacar
> > que los sockets del
> > cliente y del servidor son del tipo tcp por lo cual
> > deberian ser
> > compatibles, ambos son declarados algo así como
> >
> > aux_sock=socket(AF_INET, SOCK_STREAM, 0);
> >
> > Si alguien me pueda ayudar, o si bien necesitan más
> > información, desde ya lo
> > agradecería.
> > Saludos.
> >
>
> Estimado Simon:
>
> Antes que nada, disculpa la demora de mi respuesta,
> para el server, yo he usado estructuras del tipo=
>
> SOCKET m_socket;
> sockaddr_in service;
> SOCKET AcceptSocket;
>
> usandolos asi=
>
> // PASO 1:
> Negociacion con la lib de manejo de sockets
>
> // PASO 2:
> // Create a socket.
> m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
>
> // PASO 3:
> // lose the pesky "Address already in use" error
> message
>
> setsockopt(m_socket,SOL_SOCKET,SO_REUSEADDR,(char
> *)&ttl,sizeof(ttl))
>
> // PASO 4:
> service.sin_family=AF_INET;
> service.sin_addr.s_addr=inet_addr("192.168.2.242");
> service.sin_port=htons(3000); // puerto de escucha
> if
> (bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
>
> // PASO 5:
> // Listen on the socket.
> if (listen(m_socket,1)==SOCKET_ERROR)
>
> // PASO 6:
> // Accept connections.
> printf("Waiting for a client to connect...\n");
> while (1){
> AcceptSocket=SOCKET_ERROR;
> while (AcceptSocket==SOCKET_ERROR)
> AcceptSocket=accept(m_socket,NULL,NULL);
> printf("Client Connected.\n");
> m_socket=AcceptSocket;
> break;
> }
>
>
> y para el cliente, algo asi=
>
> // PASO 1:
>
> Negociacion con la lib de manejo de sockets
>
> // PASO 2:
>
> m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
>
> // PASO 3:
> // lose the pesky "Address already in use" error
> message
> setsockopt(this->m_socket,SOL_SOCKET,SO_REUSEADDR,(char
> *)&ttl,sizeof(ttl))
>
> // PASO 4:
> clientService.sin_family=AF_INET;
> clientService.sin_addr.s_addr=inet_addr("192.168.2.242");
> clientService.sin_port=htons("3000");
>
> // PASO 5:
>
> if
> (connect(m_socket,(SOCKADDR*)&clientService,sizeof(clientService))==SOCKET
> _ERROR){
>
> // PASO 6:
>
> si no hay errores de conexion, estas conectado.
>
> Puedes usar tambien "htonl(INADDR_ANY);" en donde dice
> "inet_addr("192.168.2.242");" en el server y/o cliente
> y te tomara la ip local de tu pc, automaticamente.
>
> saludos.
>
> PD: Consejo, pon en google "management sockets with C"
> y selecciona label "Grupos", encontraras informacion
> hasta el artazgo. La verdad que esos grupos son de
> mucha ayuda.
>
> __________________________________________________
> Correo Yahoo!
> Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
> ¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar
Simon:
Dices que tienes una tarjeta con ip 192.168.1.189 y otra con 192.168.2.2.
¿Existe algun router de por medio o estan conectadas directamente en capa 2(cable, HUB, Switch)?
> tarjeta eth0 tiene ip
> > 192.168.1.189 y la tarjeta de red eth1 (que es la
> > que se conecta con el
> > cliente) tiene ip 192.168.2.2 por lo cual en el
Ambas redes son clase C por lo que por defecto tomaran mascaras 255.255.255.0 si tu no las modificas tanto en Linux como en Windows.
Si todo esta por defecto significa que ambos equipos estan aislados y nunca se veran a menos que un router haga el ruteo respectivo.
Red1: 192.168.1.0
Red2: 192.168.2.0
O modificas la mascara a 255.255.0.0 en ambos equipos o dejas ambos equipos en la misma red.
Espero que tu problema no sea ese por que es algo muy basico en el protocolo IP y tu estas programando un SOCKET.
Este mensaje es de naturaleza confidencial y puede contener información protegida por normas de secreto y propiedad intelectual. Si usted ha recibido este correo electrónico por error, le agradeceremos se comunique inmediatamente con nosotros por este misma vía y tenga además la amabilidad de borrar el mensaje y sus adjuntos; así mismo, usted no debera copiar el mensaje ni sus adjuntos ni divulgar su contenido a ninguna persona. Muchas gracias.
THIS MESSAGE IS CONFIDENTIAL BY ITS NATURE. IT MAY ALSO CONTAIN INFORMATION THAT IS PRIVILEGED OR OTHERWISE LEGALLY EXEMPTED FROM DISCLOSURE. IF YOU HAVE RECEIVED IT BY MISTAKE, PLEASE LET US KNOW BY E-MAIL IMMEDIATELY AND DELETE THE MESSAGE AND ITS EXHIBITS FROM THE SYSTEM; YOU SHOULD ALSO NOR COPY THE MESSAGE OR ITS EXHIBITS NOR DISCLOSE ITS CONTENTS TO ANYONE. THANK YOU.
Más información sobre la lista de distribución Linux