problema con sockets

Simon Norambuena crazy_man12 en hotmail.com
Jue Dic 21 14:51:14 CLST 2006


>From: juan pablo Rumie Vittar <juanpablo_rv en yahoo.com.ar>
>Reply-To: Discusion de Linux en Castellano <linux en listas.inf.utfsm.cl>
>To: linux en listas.inf.utfsm.cl
>Subject: problema con sockets
>Date: Wed, 20 Dec 2006 10:44:15 -0300 (ART)
>
>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


gracias ya solucioné mi problema.. el cual era que en el cliente cuando 
definía el puerto del servidor, lo hacia sin htons() por lo cual no se me 
conectaba al puerto que quería.
En todo caso en el codigo que me adjuntas aparecen ciertas opciones de 
sockets que no conocíaasi que las estudiaré.
Saludos.


----
Simón Norambuena                                       Valparaiso - Longaví
Estudiante Ingenieria Civil Eléctrica                          UTFSM
Linux user: #298615
"Lo que sabemos es una gota de agua; lo que ignoramos es el océano"(Isaac 
Newton)

_________________________________________________________________
De todo para la Mujer Latina http://latino.msn.com/mujer/



Más información sobre la lista de distribución Linux