Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/12/2010, 06:40
prop
 
Fecha de Ingreso: marzo-2010
Mensajes: 18
Antigüedad: 14 años, 1 mes
Puntos: 0
Exclamación problema con programacion de sockets

El problema que tengo es que al implementar los sockets sin conexion (datagrama) el cliente no es capaz de recibir el mensaje. El codigo es el siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#define MAX 100
/*
*
*/

void recepcion(){

int socket1;
struct sockaddr_in socketPropio;
struct sockaddr_in socketRemoto;
socklen_t tam;
int num;
char mensaje[MAX];

if ((socket1 = socket(PF_INET, SOCK_DGRAM, 0)) == -1){
perror("Error\n");
exit(1);
}
socketPropio.sin_family = AF_INET;
socketPropio.sin_port = htons(9010);
socketPropio.sin_addr.s_addr = htonl(INADDR_ANY); //direccion IP propia
//bzero(&(socketPropio.sin_zero), 8);

if (bind(socket1, (struct sockaddr *)&socketPropio, sizeof(struct
sockaddr)) == -1){
perror("Error\n");
exit(1);
}
tam = sizeof(struct sockaddr);
if ((num=(recvfrom(socket1, mensaje, strlen(mensaje), 0, NULL, NULL))) == -1){
perror("Error\n");
exit(1);
}
printf("Paquete proveniente de: %s\n", inet_ntoa(socketRemoto.sin_addr));
printf("Longitud del paquete en bytes: %d\n", num);
mensaje[num] ='\0';
printf("El paquete contiene : %s\n",mensaje);
close(socket1);

}


void envio(){
int socket1;
struct sockaddr_in socketRemoto;
struct sockaddr_in socketPropio;
struct hostent *host;
int num;
char mensaje[MAX]="Hola mundo.\0";

/*if ((host=gethostbyname("www.elpais.es")) == NULL){
printf("Error\n");
exit(1);
}*/
if ((socket1 = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("Error\n");
exit(1);
}

socketPropio.sin_family = AF_INET;
socketPropio.sin_port = htons(9011);
socketPropio.sin_addr.s_addr = INADDR_ANY;

socketRemoto.sin_family = AF_INET;
socketRemoto.sin_port = htons(9011); //numeros de puerto distintos
socketRemoto.sin_addr.s_addr = inet_addr("127.0.0.1"); //direccion IP remota (mismo ordenador)
//bzero(&(socketRemoto.sin_zero), 8);
if (bind(socket1, (struct sockaddr *)&socketRemoto, sizeof(struct
sockaddr)) == -1){
perror("Error\n");
exit(1);
}
if ((num=sendto(socket1, mensaje, strlen(mensaje),
0, (struct sockaddr *)&socketPropio,sizeof(struct sockaddr))) == -1){
perror("Error\n");
exit(1);
}
printf("Enviados %d bytes hacia %s\n", num, inet_ntoa(socketRemoto.sin_addr));

close(socket1);

}

int main(int argc, char** argv) {
int opcion;
printf("Teclee opcion: ");
printf("\n\t1-envio");
printf("\n\t2-recepcion");
printf("\n\t3-salir\n");
scanf("%d", &opcion);
do{
if(opcion==1)
envio();
else if (opcion == 2)
recepcion();
}while (opcion != 3);

return (EXIT_SUCCESS);
}