d1cor

sock_inet_stream_srv.c

Oct 18th, 2017
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.62 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : JuncoTIC / UM               *
  4. * Contact    : juncotic.com                *
  5. *******************************************/
  6.  
  7. /*
  8.     Uso:
  9.         ./servidor <puerto>
  10. */
  11.  
  12.  
  13. #include<stdio.h>
  14. #include<stdlib.h>
  15. #include<sys/types.h>
  16. #include<sys/stat.h>
  17. #include<unistd.h>
  18. #include<string.h>
  19. #include<fcntl.h>
  20. #include<errno.h>
  21. #include<sys/socket.h>
  22. #include<netinet/in.h>
  23.  
  24. #define BUF_SIZE 1024
  25.  
  26. int main(int argc, char** argv) {
  27.  
  28.     char *error;
  29.  
  30.     int sockid, conn_sock, count;
  31.     struct sockaddr_in direccion;
  32.     char buffer[BUF_SIZE];
  33.  
  34.  
  35.     //creamos el socket inet-stream
  36.     if((sockid=socket(PF_INET,SOCK_STREAM,0))<0){
  37.         error="socket";
  38.         goto err;
  39.     }
  40.  
  41.  
  42.     //seteamos la direccion en la que va a escuchar
  43.     direccion.sin_family=AF_INET; //address family
  44.     direccion.sin_port=htons(atoi(*(argv+1)));  //atoi ascii to integer
  45.     direccion.sin_addr.s_addr=htonl(INADDR_ANY); //0.0.0.0
  46.  
  47.  
  48.     //asociamos el socket con la direccion (bind)
  49.     if((bind(sockid, (struct sockaddr *)&direccion, sizeof(direccion)))<0){
  50.         error="bind";
  51.         goto err;
  52.     }
  53.  
  54.  
  55.     // seteamos la cantidad de conexiones concurrentes en cola
  56.     listen(sockid,1);
  57.  
  58. /*
  59.        #include <sys/types.h>
  60.        #include <sys/socket.h>
  61.  
  62.        int listen(int sockfd, int backlog);
  63.             sockfd: socket ID
  64.             backlog: conex concurrentes en cola
  65.  
  66. */
  67.  
  68.     //dejamos escuchando al proceso en el socket ip:puerto
  69.     if((conn_sock=accept(sockid,NULL,NULL))<0){
  70.         error="accept";
  71.         goto err;
  72.     }
  73.  
  74.  
  75.     // ya tenemos un conn_sock de datos asociado con el cliente conectado
  76.     while(count=recv(conn_sock,buffer,BUF_SIZE,0)){
  77.         if (count < 0){
  78.             error="recv";
  79.             goto err;
  80.         }
  81.  
  82.         *(buffer+count)='\0';
  83.         if(!strncmp(buffer,"exit",4)){
  84.             printf("Terminando servidor...\n");
  85.             break;
  86.         }
  87.  
  88.         printf("Recibiendo datos: %s\n",buffer);
  89.     }
  90.  
  91.     close(sockid);
  92.  
  93.     return 0;
  94.  
  95. err:
  96.     fprintf(stderr,"%d %s %s\n",errno,error,strerror(errno));
  97.     exit(1);
  98.  
  99. }
  100.  
  101. /*
  102.  
  103. struct sockaddr_in {
  104.     short            sin_family;   // e.g. AF_INET
  105.     unsigned short   sin_port;     // e.g. htons(3490)
  106.     struct in_addr   sin_addr;     // see struct in_addr, below
  107.     char             sin_zero[8];  // zero this if you want to
  108. };
  109.  
  110. struct in_addr {
  111.     unsigned long s_addr;  // load with inet_aton()
  112. };
  113.  
  114.  
  115.  
  116. tcpip conexiones tcp:
  117.     client  server
  118.         > syn       \
  119.         < ack +syn  |   establecimiento de la conexion -> conn_sock
  120.         > ack       /
  121.         ...
  122.         trafico cliente-servidor usando el conn_sock
  123.         ...
  124.         < fin       \
  125.         > ack + fin |   fin de la conexion (circuito virtual tcp)
  126.         < ack       /
  127.  
  128.  
  129.  
  130. */
Add Comment
Please, Sign In to add comment