--- /dev/null
+/*
+ * Ejemplo de server Datagram, para chateo P2P
+ *
+ * Por Ricardo Markiewicz
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+
+#define SERVER_PORT 4321
+#define BUFFER_LEN 1024
+
+int main(int argc, char *argv[])
+{
+ int sockfd;
+ struct sockaddr_in their_addr; /* Almacenara la direccion IP y numero de puerto del servidor */
+ struct hostent *he;
+ int numbytes;
+ if (argc != 3) {
+ fprintf(stderr,"usage: cliente hostname mensaje\n");
+ exit(1);
+ }
+
+ /* convertimos el hostname a su direccion IP */
+ if ((he=gethostbyname(argv[1])) == NULL) {
+ herror("gethostbyname");
+ exit(1);
+ }
+
+ /* Creamos el socket */
+ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ perror("socket");
+ exit(1);
+ }
+
+ their_addr.sin_family = AF_INET; /* host byte order */
+ their_addr.sin_port = htons(SERVER_PORT); /* network byte order */
+ their_addr.sin_addr = *((struct in_addr *)he->h_addr);
+ bzero(&(their_addr.sin_zero), 8);
+
+ /* enviamos el mensaje, esta linea contiene una barra invertida al final,
+ * indicando que sigue abajo
+ */
+ if ((numbytes=sendto(sockfd,argv[2],strlen(argv[2]),0,(struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
+ perror("sendto");
+ exit(1);
+ }
+
+ printf("enviados %d bytes hacia %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
+
+ close(sockfd);
+
+ return 0;
+}
+
--- /dev/null
+
+#include <stdio.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+void *ejecuta_animal(void *p)
+{
+ int i;
+ int cuento = rand()%15;
+ int retardo = rand()%5+1;
+ char *yo = (char *)p;
+
+ printf("%s::voy contar hasta %d (con retardo=%d)\n", yo, cuento, retardo);
+
+ for(i=0; i<=cuento; i++) {
+ printf("%s:: voy por %d de %d\n", yo, i, cuento);
+ sleep(retardo);
+ }
+
+ return NULL;
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t s1, s2, s3;
+
+ srand(time(NULL));
+ pthread_create(&s1, NULL, ejecuta_animal, "GNU");
+ pthread_detach(s1);
+ pthread_create(&s2, NULL, ejecuta_animal, "Vaca");
+ pthread_detach(s2);
+ pthread_create(&s3, NULL, ejecuta_animal, "Conejo");
+ pthread_detach(s3);
+
+ pthread_exit(NULL);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Ejemplo de server Datagram, para chateo P2P
+ *
+ * Por Ricardo Markiewicz
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+#include <sys/types.h>
+
+#define SERVER_PORT 4321
+#define BUFFER_LEN 1024
+
+int main(int argc, char *argv[])
+{
+ int sockfd;
+ struct sockaddr_in my_addr; /* direccion IP y numero de puerto local */
+ struct sockaddr_in their_addr; /* direccion IP y numero de puerto del cliente */
+ /* addr_len contendra el tamanio de la estructura sockadd_in y numbytes el
+ * numero de bytes recibidos
+ */
+ int addr_len, numbytes;
+ char buf[BUFFER_LEN]; /* Buffer de recepcion */
+
+ /* se crea el socket */
+ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ perror("socket");
+ exit(1);
+ }
+
+ /* Se establece la estructura my_addr para luego llamar a bind() */
+ my_addr.sin_family = AF_INET; /* host byte order */
+ my_addr.sin_port = htons(SERVER_PORT); /* network byte order */
+ my_addr.sin_addr.s_addr = INADDR_ANY; /* se asigna automaticamente la direccion IP local */
+ bzero(&(my_addr.sin_zero), 8); /* rellena con ceros el resto de la estructura */
+
+ /* Se le da un nombre al socket */
+ printf("Creando socket ....\n");
+ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
+ perror("bind");
+ exit(1);
+ }
+
+ /* Se reciben los datos */
+ addr_len = sizeof(struct sockaddr);
+ printf("Esperando datos ....\n");
+ if ((numbytes=recvfrom(sockfd, buf, BUFFER_LEN, 0, (struct sockaddr *)&their_addr, &addr_len)) == -1) {
+ perror("recvfrom");
+ exit(1);
+ }
+
+ /* Se visualiza lo recibido */
+ printf("paquete proveniente de : %s\n",inet_ntoa(their_addr.sin_addr));
+ printf("longitud del paquete en bytes : %d\n",numbytes);
+ buf[numbytes] = '\0';
+ printf("el paquete contiene : %s\n", buf);
+
+ /* devolvemos recursos al sistema */
+ close(sockfd);
+
+ return 0;
+}
+