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