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);
}
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 de luzrael
-1
1 respuesta más de otro experto
Respuesta de lordford
1