Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <sys/time.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <stdlib.h>
- #define TECLAT 0 /* descriptor de fitxer de l'entrada estàndard */
- #define PORTTCPSERV 1756 /* #port TCP on el servidor escolta peticions */
- int main (void)
- {
- int sesc; /* descriptor del socket (local) on s’escolten peticions */
- int scon; /* descriptor del nou socket (local) connectat al client */
- fd_set conjunt; /* conjunt de descriptors de fitxer de lectura */
- int descmax; /* numero de descriptor de fitxer major */
- struct sockaddr_in adrloc; /* adreça del servidor (local)*/
- struct sockaddr_in adrrem; /* adreça del client (remota) */
- int long_adrrem; /* longitud de l’adreça remota */
- char buffer[200]; /* vector de char (en C es un byte) on es guarden dades */
- int numbytes; /* nombre de bytes rebuts */
- int i;
- /* Es crea el socket del servidor per escoltar peticions de connexió */
- if((sesc = socket(AF_INET, SOCK_STREAM /*TCP*/, 0)) == -1)
- {
- perror("Error en la crida socket\n");
- exit(-1);
- }
- /* S’assigna una adreça al socket local sesc: @IP 0.0.0.0 i #port PORTTCPSERV */
- adrloc.sin_family= AF_INET;
- adrloc.sin_addr.s_addr= INADDR_ANY; /*!*/
- adrloc.sin_port = htons(PORTTCPSERV);
- for(i=0;i<8;i++){adrloc.sin_zero[i]='0';}
- if(bind(sesc, (struct sockaddr *)&adrloc, sizeof(adrloc)) == -1) /*per que es lliguen port TCP amb adreca IP al servidor i no al client?*/
- {
- perror("Error en la crida bind\n");
- close(sesc);
- exit(-1);
- }
- /* Es crea una cua per escoltar peticions de connexió */
- if(listen(sesc,3)==-1)
- {
- perror("Error en listen\n");
- close(sesc);
- exit(-1);
- }
- /* Esperant connexió del client... */
- /* Un cop acceptada la connexió, scon serà el nou identificador del socket local */
- /* per aquesta connexió, i a més ja tindrà una @IP concreta assignada */
- long_adrrem = sizeof(adrrem);
- if((scon = accept(sesc,(struct sockaddr*)&adrrem, &long_adrrem))==-1)
- {
- perror("Error en accept\n");
- close(sesc);
- exit(-1);
- }
- /* Poden arribar dades via teclat o via scon: fem una llista de lectura amb els dos */
- FD_ZERO(&conjunt); /* esborrem el contingut de la llista */
- FD_SET(TECLAT,&conjunt); /* afegim (“marquem”) el teclat a la llista */
- FD_SET(scon,&conjunt); /* afegim (“marquem”) el socket connectat a la llista */
- descmax = scon; /* el número de descriptor màxim */
- /* examinem lectura del teclat i del socket scon amb la llista conjoriginal */
- if(select(descmax+1, &conjunt, NULL, NULL, NULL) == -1)
- {
- perror("Error en select\n");
- exit(-1);
- }
- /* ara a conjunt no hi ha “marcats” teclat i scon sinó només un d’ells: aquell al que */
- /* han arribat dades i sobre el qual cal llegir */
- if(FD_ISSET (TECLAT,&conjunt)) /* el teclat està “marcat”? */
- {
- /* Han arribat dades al teclat esperant a ser llegides */
- numbytes = read(TECLAT,buffer,200);
- /* Han arribat numbytes bytes (<=200) i els hem guardat en el vector buffer */
- }
- if(FD_ISSET (scon,&conjunt)) /* el socket scon està “marcat”? */
- {
- /* Han arribat dades al socket scon esperant a ser llegides, que provenen del client */
- numbytes = read(scon,buffer,200);
- /* Han arribat numbytes bytes (<=200) i els hem guardat en el vector buffer */
- }
- printf("Sock LOC: @IP %s, TCP, #port %d\n",inet_ntoa(adrloc.sin_addr),ntohs(adrloc.sin_port));//getsocketname
- printf("Sock REM: @IP %s, TCP, #port %d\n",inet_ntoa(adrrem.sin_addr),ntohs(adrrem.sin_port));//alternativa: getpeername
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement