#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include "common.h"

int main()
{
  int listenSock, connSock, ret;
  struct sockaddr_in servaddr;
  struct sctp_initmsg initmsg;
  char buffer[MAX_BUFFER+1];



char *message=NULL;
message = (char*)malloc(sizeof(char)*30);
int exitMsg = 0, i=0;

  /* Crea socket SCTP */
  listenSock = socket( AF_INET, SOCK_STREAM, IPPROTO_SCTP );

  // Configuración de socket: acepta cualquier conexión
  bzero( (void *)&servaddr, sizeof(servaddr) );
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); //direccion IP,cualquiera
  servaddr.sin_port = htons(MY_PORT_NUM); //puerto, definido en "common.h"
  
  ret = bind( listenSock, (struct sockaddr *)&servaddr, sizeof(servaddr) );

  /* Configuración de asociacion:
			Acepta máximo 5 streams por cada socket
  */
  memset( &initmsg, 0, sizeof(initmsg) );
  initmsg.sinit_num_ostreams = 5;
  initmsg.sinit_max_instreams = 5;
  initmsg.sinit_max_attempts = 4;
  
  ret = setsockopt( listenSock, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(initmsg) );

  /* Socket en estado LISTEN */
  listen( listenSock, 5 );

  printf("Esperando una conexión SCTP.\n");
  while( 1 ) {
    
    	connSock = accept( listenSock, (struct sockaddr *)NULL, 0);
	printf("Asociación iniciada ... \n");
    	// Se acepta conexión...
	while(!exitMsg)
	{
		scanf ("%s",message);
		if(!strcmp("exit",message)) exitMsg = 1;
		snprintf( buffer, MAX_BUFFER, "%s\n", message);
		ret = sctp_sendmsg( connSock, (void *)buffer, (size_t)strlen(buffer),NULL, 0, 0, 0, i, 0, 0 ); 
		i++;
		if(i==STREAM_MAX) i=0;
	}
	message=" ";
	exitMsg=0;
    
	// CIERRA CONEXION
	close( connSock );
	printf(" .... Conexión Cerrada.\n");
  }
  
  free(message);
  return 0;
}

