Advertisement
Guest User

Untitled

a guest
Oct 24th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #include <sys/time.h>
  4.  
  5. #include <sys/types.h>
  6.  
  7. #include <sys/socket.h>
  8.  
  9. #include <netinet/in.h>
  10.  
  11. #include <unistd.h>
  12.  
  13. #include <stdlib.h>
  14.  
  15. #define TECLAT 0 /* descriptor de fitxer de l'entrada estàndard */
  16.  
  17. #define PORTTCPSERV 1756 /* #port TCP on el servidor escolta peticions */
  18.  
  19. int main (void)
  20.  
  21. {
  22.  
  23. int sesc; /* descriptor del socket (local) on s’escolten peticions */
  24.  
  25. int scon; /* descriptor del nou socket (local) connectat al client */
  26.  
  27. fd_set conjunt; /* conjunt de descriptors de fitxer de lectura */
  28.  
  29. int descmax; /* numero de descriptor de fitxer major */
  30.  
  31. struct sockaddr_in adrloc; /* adreça del servidor (local)*/
  32.  
  33. struct sockaddr_in adrrem; /* adreça del client (remota) */
  34.  
  35. int long_adrrem; /* longitud de l’adreça remota */
  36.  
  37. char buffer[200]; /* vector de char (en C es un byte) on es guarden dades */
  38.  
  39. int numbytes; /* nombre de bytes rebuts */
  40.  
  41. int i;
  42.  
  43. /* Es crea el socket del servidor per escoltar peticions de connexió */
  44.  
  45. if((sesc = socket(AF_INET, SOCK_STREAM /*TCP*/, 0)) == -1)
  46.  
  47. {
  48.  
  49. perror("Error en la crida socket\n");
  50.  
  51. exit(-1);
  52.  
  53. }
  54.  
  55.  
  56.  
  57. /* S’assigna una adreça al socket local sesc: @IP 0.0.0.0 i #port PORTTCPSERV */
  58.  
  59. adrloc.sin_family= AF_INET;
  60.  
  61. adrloc.sin_addr.s_addr= INADDR_ANY; /*!*/
  62.  
  63. adrloc.sin_port = htons(PORTTCPSERV);
  64.  
  65. for(i=0;i<8;i++){adrloc.sin_zero[i]='0';}
  66.  
  67. if(bind(sesc, (struct sockaddr *)&adrloc, sizeof(adrloc)) == -1) /*per que es lliguen port TCP amb adreca IP al servidor i no al client?*/
  68.  
  69. {
  70.  
  71. perror("Error en la crida bind\n");
  72.  
  73. close(sesc);
  74.  
  75. exit(-1);
  76.  
  77. }
  78.  
  79.  
  80.  
  81. /* Es crea una cua per escoltar peticions de connexió */
  82.  
  83. if(listen(sesc,3)==-1)
  84.  
  85. {
  86.  
  87. perror("Error en listen\n");
  88.  
  89. close(sesc);
  90.  
  91. exit(-1);
  92.  
  93. }
  94.  
  95. /* Esperant connexió del client... */
  96.  
  97. /* Un cop acceptada la connexió, scon serà el nou identificador del socket local */
  98.  
  99. /* per aquesta connexió, i a més ja tindrà una @IP concreta assignada */
  100.  
  101. long_adrrem = sizeof(adrrem);
  102.  
  103. if((scon = accept(sesc,(struct sockaddr*)&adrrem, &long_adrrem))==-1)
  104.  
  105. {
  106.  
  107. perror("Error en accept\n");
  108.  
  109. close(sesc);
  110.  
  111. exit(-1);
  112.  
  113. }
  114.  
  115. /* Poden arribar dades via teclat o via scon: fem una llista de lectura amb els dos */
  116.  
  117. FD_ZERO(&conjunt); /* esborrem el contingut de la llista */
  118.  
  119. FD_SET(TECLAT,&conjunt); /* afegim (“marquem”) el teclat a la llista */
  120.  
  121. FD_SET(scon,&conjunt); /* afegim (“marquem”) el socket connectat a la llista */
  122.  
  123. descmax = scon; /* el número de descriptor màxim */
  124.  
  125. /* examinem lectura del teclat i del socket scon amb la llista conjoriginal */
  126.  
  127. if(select(descmax+1, &conjunt, NULL, NULL, NULL) == -1)
  128.  
  129. {
  130.  
  131. perror("Error en select\n");
  132.  
  133. exit(-1);
  134.  
  135. }
  136.  
  137. /* ara a conjunt no hi ha “marcats” teclat i scon sinó només un d’ells: aquell al que */
  138.  
  139. /* han arribat dades i sobre el qual cal llegir */
  140.  
  141. if(FD_ISSET (TECLAT,&conjunt)) /* el teclat està “marcat”? */
  142.  
  143. {
  144.  
  145. /* Han arribat dades al teclat esperant a ser llegides */
  146.  
  147. numbytes = read(TECLAT,buffer,200);
  148.  
  149. /* Han arribat numbytes bytes (<=200) i els hem guardat en el vector buffer */
  150.  
  151. }
  152.  
  153. if(FD_ISSET (scon,&conjunt)) /* el socket scon està “marcat”? */
  154.  
  155. {
  156.  
  157. /* Han arribat dades al socket scon esperant a ser llegides, que provenen del client */
  158.  
  159. numbytes = read(scon,buffer,200);
  160.  
  161. /* Han arribat numbytes bytes (<=200) i els hem guardat en el vector buffer */
  162.  
  163. }
  164.  
  165.  
  166.  
  167. printf("Sock LOC: @IP %s, TCP, #port %d\n",inet_ntoa(adrloc.sin_addr),ntohs(adrloc.sin_port));//getsocketname
  168.  
  169. printf("Sock REM: @IP %s, TCP, #port %d\n",inet_ntoa(adrrem.sin_addr),ntohs(adrrem.sin_port));//alternativa: getpeername
  170.  
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement