#include #include #include //#include //#include #include #include //#include #include //#include //#include //#include #define PUERTO "12345" #define MAXBUFFER 256 int main(int argc, char *argv[]) { int sd; // descriptor del socket reusable para conexiones por el mismo puerto. struct addrinfo hints, *servinfo, *p; // estructura getaddrinfo int res; char str[MAXBUFFER]; int one=1; char dir[32]; if (argc > 1) strcpy(dir, argv[1]); else strcpy(dir,"127.0.0.1"); memset(&hints, 0, sizeof(hints)); // se inicia la estructura en cero hints.ai_family = AF_UNSPEC; // para IPv4 o IPv6 hints.ai_socktype = SOCK_STREAM; // tipo de transmision de datos //hints.ai_flags = AI_PASSIVE; // localhost, con addr NULL if ((res = getaddrinfo(dir, PUERTO, &hints, &servinfo)) != 0) { printf("getaddrinfo: %s\n", gai_strerror(res)); return -1; } // hacemos bind a la lista de direcciones que corresponden a la llamada de getaddrinfo for (p = servinfo; p != NULL; p = p->ai_next) { if ((sd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { // no se pudo abrir el socket perror("socket"); continue; // trata otra estructura en la lista } if (setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,(char *) &one,sizeof(one)) == -1 ) { perror("setsockopt"); continue; // trata otra estructura en la lista } // cliente if (connect(sd, p->ai_addr, p->ai_addrlen) == -1) { // no se pudo conectar shutdown(sd, 2); perror("connect"); continue; // trata otra estructura en la lista } break; // Ya esta conectado. } if (p == NULL) { // Se sale de la lista sin bind establecido fprintf(stderr, "fallo en bind.\n"); return -1; } // listo para transmisiones entre cliente y servidor TCP freeaddrinfo(servinfo); // eliminamos la estructura, para liberar la memoria. while ((gets(str)) != NULL) { if (strcmp(str,"BYE") == 0) break; if ((send(sd, str, MAXBUFFER, 0)) < 0) { printf("Error, conexión perdida.\n"); exit(-1); } printf("Cliente: %s\n", str); sprintf(str, " "); recv(sd, str, MAXBUFFER, 0); printf("Servidor: %s\n", str); } close(sd); return 0; }