problema con sockets

juan pablo Rumie Vittar juanpablo_rv en yahoo.com.ar
Mie Dic 20 10:44:15 CLST 2006


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


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