Programacion con sockets

Tengo un problema con la recepción de un mensaje por un socket en un cliente que estoy programando el servidor también lo hago yo y no se mu bien en cual estará el problema, os pongo el código y si me lo puede solucionar se lo agradecería.
Servidor:
Definiciones:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netdb.h>
#include <unistd.h>
#include "buzon.h"
#include "comando.h"
struct servidor{
int puerto;
int socconect,socdatos;
struct sockaddr_in direcorigen,direcdestino;
char estado[80];
struct buzonmensajes buzon;
char usuario[30];
int clave;
};
codigo.
void ejecutarservidor(){
printf("comienza la ejecucion del servidor\n");
if((servidor.socconect=socket(AF_INET, SOCK_STREAM, 0))<0)
perror("Error al crear el socket\n");
else{
servidor.direcorigen.sin_family= AF_INET;
printf("el puerto del servidor es:%d",servidor.puerto);
servidor.direcorigen.sin_port= htons(servidor.puerto);
servidor.direcorigen.sin_addr.s_addr= htonl(INADDR_ANY);
}
if( bind(servidor.socconect, (struct sockaddr *)&servidor.direcorigen, sizeof(servidor.direcorigen)) <0)
perror("Error al enlazar el socket\n");
if(listen(servidor.socconect,SOMAXCONN)==-1)
perror("ERROR: listen\n");
else {
printf("Bamos a conectar\n");
conectar();
}
}
int conectar(){
int tam;
char cadena[128];
tam=sizeof(servidor.direcdestino);
//printf("el tamaño de la direccione de destino es:%d",tam);
//printf("\n");
if((servidor.socdatos=accept(servidor.socconect,(struct sockaddr *)&(servidor.direcdestino),&tam)<0)){
perror("Error al aceptar la conexion del cliente\n");
return 0;
}
else printf("socket aceptado con exito\n");
strcpy(cadena,"+OK Ha conectado con el servidor de POP3");
if (enviar(cadena)){
strcpy(servidor.estado,"autentificacion");
return 1;
}
else {
printf("error al enviar la cadena\n");
return 0;
}
}
int enviar(char *cadena){
int tam;
//char cadena2[512];
//strcpy(cadena2,"holaaaaaaaa");
//cadena2[strln(cadena2)+1]="\n";
printf("Vamos a enviar: %s\n",cadena);
strcat(cadena,"\r\n");
//falta partir el ,mensaje en partes de 512bytes
tam=write(servidor.socdatos,cadena,sizeof cadena);
//tam=send(servidor.socdatos, cadena, strlen(cadena), 0);
if(tam<0){
printf("Error al enviar los datos\n");
return 0;
}
else {
printf("Datos enviados con exito\n");
return tam;
}
}
int main (int argc, char *argv[]){
//struct servidor servidor;
// Si se ha introducido un nº de parámetros incorrecto MOSTRAR AYUDA
if(argc!=2){
exit(1);
}
// Si el puerto introducido es incorrecto MOSTRAR AYUDA
if( atoi(argv[1])>65535 || atoi(argv[1])<1025 ){
exit(1);
}
servidor.puerto=atoi(argv[1]);
printf("el puerto del servidor es:%d",servidor.puerto);
ejecutarservidor();
return 0;
}
cliente:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
#define TAM_MAX_BLOQUE 512
int main (int argc, char *argv[]){
/*
La forma de llamar al servidor de pop3 es la siguiente:
Nombre del ejecutable dirección del servidor pop3 numero de puerto por el que escucha este
en nuestro caso
*/
//Declaraciones
char buffer[512];
int puerto,soc,i,tambytes;
char id[80];
char pas[80];
char comand[80];
struct sockaddr_in direcorigen,direcdestino;
struct hostent * servidor;
if (argc<2 || argc>3){
printf("Error en el numero de parametros\n");
return 0;
}
if (argc==2){
printf("Se asigna el puerto por defecto\n");
puerto=110;
}
else{
if (argc==3){
printf("HOLAAAAAAAA\n");
puerto = atoi(argv[2]);
printf("%d\n",puerto);
}
}
//inicializamos la direccion de destino del servidor pop3
printf("Se empezara a rellenar la estructura de la direccion de destino\n");
servidor = (struct hostent *) NULL;
//memcpy(&direcdestino.sin_addr.s_addr,servidor->h_addr, servidor->h_length);
printf("holaaaaa\n");
direcdestino.sin_family=AF_INET;
direcdestino.sin_port=htons(puerto);
servidor=gethostbyname("orion.edv.uniovi.es");
if(servidor!=NULL){
direcdestino.sin_addr=*((struct in_addr *)servidor->h_addr);
printf("hemos rellenadao la direccion de destino\n");
}
else {
printf("Error en el nombre del servidor pop3");
exit(-1);
}
if ((soc = socket(AF_INET,SOCK_STREAM,0)) < 0){
printf("Error en socket %d\n",i);
exit(-1);
}
else printf("socket creado con exito\n");
if (connect(soc,(struct sockaddr *) &direcdestino, sizeof(direcdestino))<0){
printf("Error al conectar\n");
exit(-1);
}
else printf("socket conectado con exito\n");
//inicializamos el buffer para recivir
memset(buffer, '\0',TAM_MAX_BLOQUE);
//tambytes = recv(soc, buffer, sizeof(buffer), 0))
if((tambytes=read(soc, &buffer, sizeof buffer))<=0){
printf("Error al recibir\n");
exit(-1);
}
printf("%s\n",buffer);
}
Respuesta
-1
Define cual es el problema: si el servidor que no escucha, o el cliente no se conecta, si es que no llega el mensaje, si no llega entero, si se cierra la conexión... En fin, no querrás que escriba el código, lo ejecute para ver el problema que tu deberías describir y te lo resuelva...

1 respuesta más de otro experto

Respuesta
1
Agradezco que hayas preguntado a mi sobre el tema, pero lamento decir que aun no me he dedicado a estudiar sobre la comunicación entre aplicaciones, de veras lo siento, puedes preguntarme sobre otras cosas sin problemas y siempre que pueda obtendrás mi respuesta, pero hay que ser sinceros, sobre este tema no te puedo decir,
Pasa la pregunta a un experto con mayor experiencia y espero que resuelvas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas