programacion con sockets

capsx
05 de Abril del 2005
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);
}

chuidiang
05 de Abril del 2005
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.