programacion con sockets
Hola tengo un problema con la recepcion de un mensaje por un socket en un cliente q estoy programando el servidor tambien lo hago yo y no se mu bien en cual estara el problema, os pongo el codigo y si alguien me lo puede solucionar se lo agradeceria.
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 servidorn");
if((servidor.socconect=socket(AF_INET, SOCK_STREAM, 0))<0)
perror("Error al crear el socketn");
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 socketn");
if(listen(servidor.socconect,SOMAXCONN)==-1)
perror("ERROR: listenn");
else {
printf("Bamos a conectarn");
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 clienten");
return 0;
}
else printf("socket aceptado con exiton");
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 cadenan");
return 0;
}
}
int enviar(char *cadena){
int tam;
//char cadena2[512];
//strcpy(cadena2,"holaaaaaaaa");
//cadena2[strln(cadena2)+1]="n";
printf("Vamos a enviar: %sn",cadena);
strcat(cadena,"rn");
//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 datosn");
return 0;
}
else {
printf("Datos enviados con exiton");
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 direccion 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 parametrosn");
return 0;
}
if (argc==2){
printf("Se asigna el puerto por defecton");
puerto=110;
}
else{
if (argc==3){
printf("HOLAAAAAAAAn");
puerto = atoi(argv[2]);
printf("%dn",puerto);
}
}
//inicializamos la direccion de destino del servidor pop3
printf("Se empezara a rellenar la estructura de la direccion de destinon");
servidor = (struct hostent *) NULL;
//memcpy(&direcdestino.sin_addr.s_addr,servidor->h_addr, servidor->h_length);
printf("holaaaaan");
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 destinon");
}
else {
printf("Error en el nombre del servidor pop3");
exit(-1);
}
if ((soc = socket(AF_INET,SOCK_STREAM,0)) < 0){
printf("Error en socket %dn",i);
exit(-1);
}
else printf("socket creado con exiton");
if (connect(soc,(struct sockaddr *) &direcdestino, sizeof(direcdestino))<0){
printf("Error al conectarn");
exit(-1);
}
else printf("socket conectado con exiton");
//inicializamos el buffer para recivir
memset(buffer, ' ',TAM_MAX_BLOQUE);
//tambytes = recv(soc, buffer, sizeof(buffer), 0))
if((tambytes=read(soc, &buffer, sizeof buffer))<=0){
printf("Error al recibirn");
exit(-1);
}
printf("%sn",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 servidorn");
if((servidor.socconect=socket(AF_INET, SOCK_STREAM, 0))<0)
perror("Error al crear el socketn");
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 socketn");
if(listen(servidor.socconect,SOMAXCONN)==-1)
perror("ERROR: listenn");
else {
printf("Bamos a conectarn");
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 clienten");
return 0;
}
else printf("socket aceptado con exiton");
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 cadenan");
return 0;
}
}
int enviar(char *cadena){
int tam;
//char cadena2[512];
//strcpy(cadena2,"holaaaaaaaa");
//cadena2[strln(cadena2)+1]="n";
printf("Vamos a enviar: %sn",cadena);
strcat(cadena,"rn");
//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 datosn");
return 0;
}
else {
printf("Datos enviados con exiton");
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 direccion 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 parametrosn");
return 0;
}
if (argc==2){
printf("Se asigna el puerto por defecton");
puerto=110;
}
else{
if (argc==3){
printf("HOLAAAAAAAAn");
puerto = atoi(argv[2]);
printf("%dn",puerto);
}
}
//inicializamos la direccion de destino del servidor pop3
printf("Se empezara a rellenar la estructura de la direccion de destinon");
servidor = (struct hostent *) NULL;
//memcpy(&direcdestino.sin_addr.s_addr,servidor->h_addr, servidor->h_length);
printf("holaaaaan");
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 destinon");
}
else {
printf("Error en el nombre del servidor pop3");
exit(-1);
}
if ((soc = socket(AF_INET,SOCK_STREAM,0)) < 0){
printf("Error en socket %dn",i);
exit(-1);
}
else printf("socket creado con exiton");
if (connect(soc,(struct sockaddr *) &direcdestino, sizeof(direcdestino))<0){
printf("Error al conectarn");
exit(-1);
}
else printf("socket conectado con exiton");
//inicializamos el buffer para recivir
memset(buffer, ' ',TAM_MAX_BLOQUE);
//tambytes = recv(soc, buffer, sizeof(buffer), 0))
if((tambytes=read(soc, &buffer, sizeof buffer))<=0){
printf("Error al recibirn");
exit(-1);
}
printf("%sn",buffer);
}
Hola:
No estaría de más que dijeras qué error tienes.
De todas formas, no sé si tienes varias versiones (por las líneas comentadas) y lo que has puesto te ha quedado algo incoherente.
En el write del servidor:
si el parametro es char *cadena, no puedes usar sizeof(cadena). Deberías usar strlen(cadena) + 1
El +1 es para que se envíe también el del final.
En el cliente, o bien sabes la longitud que vas a recibir (incluido el ) o vas leyendo de uno en uno hasta que encuentres un .
Se bueno.
No estaría de más que dijeras qué error tienes.
De todas formas, no sé si tienes varias versiones (por las líneas comentadas) y lo que has puesto te ha quedado algo incoherente.
En el write del servidor:
si el parametro es char *cadena, no puedes usar sizeof(cadena). Deberías usar strlen(cadena) + 1
El +1 es para que se envíe también el del final.
En el cliente, o bien sabes la longitud que vas a recibir (incluido el ) o vas leyendo de uno en uno hasta que encuentres un .
Se bueno.
