Páginas: 1 [2]
|
 |
|
Autor
|
Tema: Duda IP cliente servidor. (Leído 550 veces)
|
Sarkis
Desconectado
Mensajes: 443
C/C++ Programmer...
|
Lo acabo de hacer pero sigue saliendo lo mismo, puede que tenga algo mal. Servidor: #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
int main() { int Descriptor_Servidor, Descriptor_Cliente; int tamano_sockaddr = sizeof(struct sockaddr); int PUERTO = 6000; char cadena [256]; struct sockaddr_in conexion;
Descriptor_Servidor = socket(AF_INET, SOCK_STREAM, 0); if (Descriptor_Servidor == -1) { printf("Error: No se ha podido abrir el socket servidor."); }
conexion.sin_family = AF_INET; conexion.sin_port = htons(PUERTO); conexion.sin_addr.s_addr = INADDR_ANY;
if (bind (Descriptor_Servidor, (struct sockaddr *) &conexion, sizeof(conexion)) == -1) { printf("Error: No se ha podido avisar al Sistema Operativo."); }
if (listen(Descriptor_Servidor, 1) == -1) { printf("Error: Notificaciones de conexion entrantes fallidas."); }
Descriptor_Cliente = accept(Descriptor_Servidor, (struct sockaddr *) &conexion, &tamano_sockaddr); if (Descriptor_Cliente == -1) { printf ("Error: No se ha podido atender a las conexiones entrantes."); }
memset(&cadena, 0, sizeof(cadena)); printf ("Introduzca un mensaje: "); scanf ("%s", &cadena); send (Descriptor_Servidor, cadena, sizeof (cadena), 0);
close(Descriptor_Servidor); close(Descriptor_Cliente); } Cliente: #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
#define IP "127.0.0.1"
int main() {
int Descriptor_Cliente; int PUERTO = 6000; int Estado_Conexion; char cadena_recibida [256]; struct sockaddr_in conexion;
Descriptor_Cliente = socket(AF_INET, SOCK_STREAM, 0); if (Descriptor_Cliente == -1) { printf("Error: No se ha podido abrir el socket cliente."); }
conexion.sin_family = AF_INET; conexion.sin_port = htons(PUERTO); conexion.sin_addr.s_addr = (inet_addr(IP)); Estado_Conexion = connect(Descriptor_Cliente, (struct sockaddr *) &conexion, sizeof(conexion)); if (Estado_Conexion == -1) { printf("Error: No se ha podido conectar al servidor."); } recv (Descriptor_Cliente, cadena_recibida, sizeof (cadena_recibida), 0); printf ("%s", cadena_recibida);
close(Descriptor_Cliente); } Imágen del problema:  ---> http://img93.imageshack.us/img93/8940/pantallazoqj6.pngSaludos
|
|
|
|
« Última modificación: 05 Julio 2008, 00:17 por sarkis »
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
dooque
Desconectado
Mensajes: 66
|
Hay varios problemas! el mas grave es que estas intetando mandar informacion por el socket donde escucha el servidor "Descriptor_Servidor" y no por el del cliente "Descriptor_Cliente", fijate en el "send()" cambia eso y ahi anda un poco mejor pero no del todo! Otro problema es q "sizeof()" te da el tamaño de la variable, q en la mayoria de los casos no es la cantidad de bytes que queres mandar i.e. si queres mandar "hola" solo vas a mandar 4 bytes en ves de los 256 q tiene la variable (**SOLUCION_1), sumado a esto esta el problema de q no inicializas las variables "cadena" ni "cadena_recibida" lo q hace q se manden los 256 bytes q hay en "cadena" (los 4 nesesario mas la basura) y cuando recibes esta bsaura se suma a la q hay en "cadena_recibida" y bueeee ya en ese puento ves cualquier cosa menos lo q mandaste jajaja!! (**SOLUCION_2).
(**SOLUCION_1): Para esto podes usar la funcion "strlen(char *)" q te dice la cantidad de caracteres (bytes en este caso) que tiene la cadena (sin contar el terminador 0, para mas info "man strlen"). Esto no es muy recomendado en tranferencias por la red debido a la alta probabilidad de q se despilfarre un byte y se vuelva cero y ahi muere la funcion jaja! pero bue! si estas seguro de q eso no pasa como en este caso q lees del stdin no hay drama! donde nucna deberias usarlo es del lado donde recibes la info!
(**SOLUCION_2): Para este caso deberias inicializar las variables con ceros como dice "Lambda". Otra opcion, y para mi la mas bonita, es pedir memoria con "calloc()" q ya te la da inicializada y luego liberarla! Es mejor y mas bonito laburar con memoria dinamica, en programas chicos no sirve tanto pero en un programa piola si y es bueno ir acostumbrandose desde ""chico"" jaja!!
saludos!!
|
|
|
|
|
En línea
|
|
|
|
dooque
Desconectado
Mensajes: 66
|
Haa y otra cosa q me olvidaba es q no miras los valores q devuelven las funciones "send" y "recv", si no quieres controlar la cantidad de bytes q se envian/reciben no importa (aunque deberias) pero si deberias diferenciar entre los tres casos mas importantes: si devuelven un valor positivo es q algo se transfirio! si devuelve 0 es que la otra parte cerro la conexion! si devuelve -1 es q hubo un error! si ubieras contemplado este caso te ubieras dado cuenta al salto del problema!
saludos!
|
|
|
|
|
En línea
|
|
|
|
Sarkis
Desconectado
Mensajes: 443
C/C++ Programmer...
|
Muchisimas gracias dooque, Lambda, Leber... Algo hice anoche con ayuda de vuestros conocimientos. El mensaje se envía muy bien y el cliente lo recibe perfectamente. Puse las evaluaciones con un if para saber si se envia bien o no el mensaje y si la conexión se mantiene correcta. Bueno, aquí dejo los codes, espero que si tengo más dudas respondáis de esa manera tán rapida y amable como lo habeis hecho hasta ahora. Servidor: #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
int main() { int Descriptor_Servidor, Descriptor_Cliente, Estado_Envio; unsigned int tamano_sockaddr = sizeof(struct sockaddr); int PUERTO = 6000; char cadena[256]; struct sockaddr_in conexion;
Descriptor_Servidor = socket(PF_INET, SOCK_STREAM, 0); if (Descriptor_Servidor == -1) { printf("Error: No se ha podido abrir el socket servidor."); }
conexion.sin_family = PF_INET; conexion.sin_port = htons(PUERTO); conexion.sin_addr.s_addr = INADDR_ANY;
if (bind (Descriptor_Servidor, (struct sockaddr *) &conexion, sizeof(conexion)) == -1) { printf("Error: No se ha podido avisar al Sistema Operativo."); }
if (listen(Descriptor_Servidor, 1) == -1) { printf("Error: Notificaciones de conexion entrantes fallidas."); }
Descriptor_Cliente = accept(Descriptor_Servidor, (struct sockaddr *) &conexion, &tamano_sockaddr); if (Descriptor_Cliente == -1) { printf ("Error: No se ha podido atender a las conexiones entrantes."); }
memset(&cadena, 0, strlen(cadena)); printf("Introduzca un mensaje: "); gets(cadena); Estado_Envio = send(Descriptor_Cliente, cadena, strlen(cadena), 0);
if (Estado_Envio == 0) { printf("Error: Se ha cerrado la conexión."); } if (Estado_Envio == -1) { printf("Error: No se ha podido enviar el mensaje."); }
close(Descriptor_Servidor); close(Descriptor_Cliente);
return (0);
} Cliente: #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>
#define IP "127.0.0.1"
int main() {
int Descriptor_Cliente, Estado_Recibo; int PUERTO = 6000; int Estado_Conexion; char cadena_recibida[256]; struct sockaddr_in conexion;
Descriptor_Cliente = socket(PF_INET, SOCK_STREAM, 0); if (Descriptor_Cliente == -1) { printf("Error: No se ha podido abrir el socket cliente."); }
conexion.sin_family = PF_INET; conexion.sin_port = htons(PUERTO); conexion.sin_addr.s_addr = (inet_addr(IP)); Estado_Conexion = connect(Descriptor_Cliente, (struct sockaddr *) &conexion, sizeof(conexion)); if (Estado_Conexion == -1) { printf("Error: No se ha podido conectar al servidor."); }
memset(&cadena_recibida, 0, sizeof(cadena_recibida)); Estado_Recibo = recv(Descriptor_Cliente, cadena_recibida, sizeof(cadena_recibida), 0); printf("Servidor dice: %s\n", cadena_recibida);
if (Estado_Recibo == 0) { printf("Error: Se ha cerrado la conexión."); } if (Estado_Recibo == -1) { printf("Error: No se ha podido recibir el mensaje."); }
close(Descriptor_Cliente);
return (0);
} Saludos y muchisimas gracias.  PD: Si le pedimos al cliente la IP a la cual conectarse para almacenarla en una variable y pasarsela a la estructura sockaddr_in...De qué tipo de dato debe ser la variable en la que se debe almacenar la IP? Estoy un poco perdido con eso.
|
|
|
|
« Última modificación: 05 Julio 2008, 15:34 por sarkis »
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
dooque
Desconectado
Mensajes: 66
|
PD: Si le pedimos al cliente la IP a la cual conectarse para almacenarla en una variable y pasarsela a la estructura sockaddr_in...De qué tipo de dato debe ser la variable en la que se debe almacenar la IP? Estoy un poco perdido con eso.
si lo va a pasar en la forma decimal con punto seria un "char *" saludos
|
|
|
|
|
En línea
|
|
|
|
Sarkis
Desconectado
Mensajes: 443
C/C++ Programmer...
|
Gracias dooque. Saludos 
|
|
|
|
|
En línea
|
 .::Cuanto mas conocimiento adquieres, más te das cuenta del que hay a tu alrededor::.
|
|
|
|
Páginas: 1 [2]
|
|
|
|