/** * Programa Servidor de Eco para una conexion SCTP * Peer - to - Peer * Similar al caso de TCP * Programado por Benjamin Ginouves * Para el proyecto de fin de ramo ELO330, 2s2010. */ #include #include #include #include #include // requiere instalar el paquete correspondiente y compilar con la libreria sctp #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 entrantes por el mismo puerto. int s; // descriptor socket conexion struct addrinfo hints, *servinfo, *p; // estructura getaddrinfo struct sockaddr_storage addrfrom; // estructura para alojar datos de conexion para la recepcion y envio al cliente SCTP. socklen_t addrfromlen; // estructura para almacenar largos de datos del cliente SCTP. int res, n; char str[MAXBUFFER]; int one=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_protocol = IPPROTO_SCTP; // definimos el protocolo SCTP hints.ai_flags = AI_PASSIVE; // localhost, con addr en NULL if ((res = getaddrinfo(NULL, 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 } // servidor if (bind(sd, p->ai_addr, p->ai_addrlen) == -1) { // no se pudo shutdown(sd, 2); perror("bind"); continue; // trata otra estructura en la lista } break; // bind listo. } if (p == NULL) { // Se sale de la lista sin bind establecido fprintf(stderr, "fallo en bind.\n"); return -1; } freeaddrinfo(servinfo); // eliminamos la estructura, para liberar la memoria, no se utilizara luego // espera una conexion del cliente listen(sd, 2); for (;;) { printf("accepta conexiones...\n"); addrfromlen = sizeof(addrfrom); s = accept(sd, (struct sockaddr *)&addrfrom, &addrfromlen); printf("Inicia Echo: \n"); while ((n = recv(s, str, MAXBUFFER, 0)) > 0) { printf("Cliente: %s\n", str); if ((send(s, str, MAXBUFFER, 0)) < 0) { printf("Error, conexión perdida.\n"); exit(-1); } } close(s); } return 0; }