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);
}