Guest User

Untitled

a guest
Oct 23rd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.24 KB | None | 0 0
  1. /*
  2.  *  svstub.c
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <string.h>
  11.  
  12.  
  13. #include "prototipo.h"
  14. #include "strustub.h"
  15.  
  16. CLSVBUFF clsvbuff;
  17. int s;
  18. char bufcom[ MAX_DATA ];
  19.  
  20. void error(char *msg)
  21. {
  22.     perror(msg);
  23.     exit(0);
  24. }
  25.  
  26. /*
  27.  *INTERFASE CON CAPA TRANSPORTE
  28. */
  29.  
  30. //Emisión
  31. int send_packet( int sockfd, const void *p, int qty )
  32.     {
  33.     int n;
  34.     memcpy( bufcom, p, qty );
  35.     n = write(sockfd,bufcom,qty);
  36.     if (n < 0)
  37.          error("ERROR writing to socket");
  38.     bzero(bufcom, MAX_DATA);
  39.     return n;
  40.     }
  41.  
  42. //Recepción
  43. int receive_packet( int sockfd, void *p, int lim )
  44.     {
  45.     int n;
  46.     n = read(sockfd,bufcom,lim);
  47.     if (n < 0)
  48.          error("ERROR reading from socket");
  49.     else
  50.     {
  51.     memcpy( p, bufcom, n );
  52.     bzero( bufcom, MAX_DATA);
  53.     }
  54.     return n;
  55.     }
  56.  
  57. //INICIALIZACION
  58. int socksv_init(char *arg1)
  59. {
  60.      int sockfd, newsockfd, portno, clilen;
  61.  
  62.      struct sockaddr_in serv_addr, cli_addr;
  63.      int n;
  64.  
  65.      sockfd = socket(AF_INET, SOCK_STREAM, 0);
  66.      if (sockfd < 0)
  67.         error("ERROR opening socket");
  68.      bzero((char *) &serv_addr, sizeof(serv_addr));
  69.      portno = atoi(arg1);
  70.      serv_addr.sin_family = AF_INET;
  71.      serv_addr.sin_addr.s_addr = INADDR_ANY;
  72.      serv_addr.sin_port = htons(portno);
  73.      if (bind(sockfd, (struct sockaddr *) &serv_addr,
  74.               sizeof(serv_addr)) < 0)
  75.               error("ERROR on binding");
  76.      listen(sockfd,5);
  77.      clilen = sizeof(cli_addr);
  78.      newsockfd = accept(sockfd,
  79.                  (struct sockaddr *) &cli_addr,
  80.                  &clilen);
  81.      if (newsockfd < 0)
  82.           error("ERROR on accept");
  83.  
  84.     //Una vez conectado, pruebo leer y escribir.
  85.      n = read(newsockfd,bufcom,MAX_DATA);
  86.      if (n < 0)
  87.     error("ERROR reading from socket");
  88.      else
  89.     printf("mensaje: %s\n",bufcom);
  90.      bzero(bufcom, MAX_DATA);
  91.  
  92.      n = write(newsockfd,"Hola Cliente..Aqui estoy",24);
  93.      if (n < 0) error("ERROR writing to socket");
  94.  
  95.      return newsockfd;
  96. }
  97.  
  98.  
  99. /*
  100.  *CAPA MIDDLEWARE (STUB)
  101.  */
  102.  
  103.  
  104. static int process_rread( DATA *p, int qty )
  105.     {
  106.     p->svcl_rread.status = rmtread( s, p->clsv_rread.pathname, p->svcl_rread.data, p->clsv_rread.qty, p->clsv_rread.binicio );
  107.     return sizeof( SVCL_RREAD );
  108.     }
  109.  
  110. static int process_rwrite( DATA *p, int qty )
  111.     {
  112.     p->svcl_rwrite.status = rmtwrite( s, p->clsv_rwrite.pathname, p->clsv_rwrite.data, p->clsv_rwrite.qty );
  113.     return sizeof( SVCL_RWRITE );
  114.     }
  115.  
  116.  
  117. static int
  118.  (*proc[])( DATA *p, int qty ) = { process_rread, process_rwrite };
  119.  
  120. static int process_server( CLSVBUFF *p, int qty )
  121.     {
  122.     int opcode;
  123.  
  124.     opcode = p->opc;
  125.     qty = (*proc[opcode])( &p->data, qty - sizeof( OPC ) );
  126.     p->opc = opcode;
  127.     return qty + sizeof( OPC );
  128.     }
  129.  
  130.  
  131. static void do_server( void )
  132.     {
  133.     int qty;
  134.  
  135.     qty = receive_packet( s, &clsvbuff, sizeof( clsvbuff ) );
  136.     qty = process_server( &clsvbuff, qty );
  137.     send_packet( s, &clsvbuff, qty );
  138.     }
  139.  
  140.  
  141. void main( void )
  142.     {
  143.     //int s;
  144.     s = socksv_init( "8888" );
  145.     if (s < 0) {
  146.         fprintf(stderr,"No abrió el Socket\n");
  147.         exit(0);
  148.     }
  149.  
  150.     for(;;)
  151.       do_server();
  152.     }
Add Comment
Please, Sign In to add comment