<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Compilaci%C3%B3</id>
	<title>Compilació - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Compilaci%C3%B3"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Compilaci%C3%B3&amp;action=history"/>
	<updated>2026-10-11T23:47:52Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Compilaci%C3%B3&amp;diff=1601&amp;oldid=prev</id>
		<title>Joan a 13:56, 3 feb 2009</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Compilaci%C3%B3&amp;diff=1601&amp;oldid=prev"/>
		<updated>2009-02-03T13:56:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Es tracta d'una aplicació client servidor d'echos, que vam realitzar en el Curs de Programació Linux de la ICE-UPC (Sergi Tur):&lt;br /&gt;
&lt;br /&gt;
el servidor escolta els echos (missatges per pantalla) que li arriben dels clients. La única cosa que fa el servidor es mostrar per pantalla els missatges que li envien els clients. És un exercici de programació de sockets en C.&lt;br /&gt;
&lt;br /&gt;
En la primera part compilarem el codi. Després l'executarem en un client i en un servidor per comprovar que funciona.&lt;br /&gt;
Més tard farem que el servidor sigui un dimoni.&lt;br /&gt;
I més tard en farem un paquet (el ''debianitzarem'') per tal de poder distribuir-lo.&lt;br /&gt;
&lt;br /&gt;
==Codi. Compilació==&lt;br /&gt;
El codi el podem descarregar de La Farga: https://lafarga.cpl.upc.edu/plugins/scmsvn/viewcvs.php/sessio5/ClientServerEcho/?rev=12&amp;amp;root=plinux&lt;br /&gt;
&lt;br /&gt;
'''server.c'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
http://xarxantoni.net:8080/mediawiki/index.php/Programaci%C3%B3_en_xarxes&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netdb.h&amp;gt;      &lt;br /&gt;
&lt;br /&gt;
//Aquí podeu escollir el port del servidor.&lt;br /&gt;
int port = 8000;&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
  struct sockaddr_in sin;&lt;br /&gt;
  struct sockaddr_in pin;&lt;br /&gt;
  int sock_descriptor;&lt;br /&gt;
  int temp_sock_descriptor;&lt;br /&gt;
  int address_size=0;&lt;br /&gt;
  char buf[16384];&lt;br /&gt;
  int i, len;&lt;br /&gt;
&lt;br /&gt;
  /*&lt;br /&gt;
  PF_INET/AF_INET Determinem IPv4 com la familia de protocols. Veieu man ip(7)&lt;br /&gt;
  SOCK_STREAM Mode orientat a connexió.&lt;br /&gt;
  0 Al fitxer /etc/protocols el protocol 0 és el IP.&lt;br /&gt;
  */&lt;br /&gt;
  sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);&lt;br /&gt;
  if (sock_descriptor == -1) {&lt;br /&gt;
    perror(&amp;quot;Error al cridar socket...&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  memset(&amp;amp;sin,0 , sizeof(sin));&lt;br /&gt;
  sin.sin_family = AF_INET;&lt;br /&gt;
  // INADDR_ANY ens permet fer el vincle amb qualsevol de les adreces IP del &lt;br /&gt;
  // servidor.&lt;br /&gt;
  sin.sin_addr.s_addr = INADDR_ANY;&lt;br /&gt;
  //La comanda htons transforma un número de port en el format de xarxa. &lt;br /&gt;
  sin.sin_port = htons(port);&lt;br /&gt;
&lt;br /&gt;
  if (bind(sock_descriptor, (struct sockaddr *)&amp;amp;sin, sizeof(sin)) == -1) {&lt;br /&gt;
    perror(&amp;quot;Error al cridar bind...&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (listen(sock_descriptor, 20) == -1) {&lt;br /&gt;
    perror(&amp;quot;Error al cridar listen...&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;El servidor esta a l'espera de rebre connexions ...\n&amp;quot;); &lt;br /&gt;
&lt;br /&gt;
  // El bucle infinit fa que el servidor es quedi escoltant noves peticions &lt;br /&gt;
  // permanentment. Cada nova petició, s'obra un nou socket per fer la &lt;br /&gt;
  // la comunicació entre el client i el servidor.&lt;br /&gt;
  &lt;br /&gt;
  while(1) {&lt;br /&gt;
    temp_sock_descriptor =&lt;br /&gt;
      accept(sock_descriptor, (struct sockaddr *)&amp;amp;pin,&lt;br /&gt;
             &amp;amp;address_size);&lt;br /&gt;
    if (temp_sock_descriptor == -1) {&lt;br /&gt;
      perror(&amp;quot;Error al cridar accept...&amp;quot;);&lt;br /&gt;
      exit(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (recv(temp_sock_descriptor, buf, 16384, 0) == -1) {&lt;br /&gt;
      perror(&amp;quot;Error al cridar recv...&amp;quot;);&lt;br /&gt;
      exit(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;S'ha rebut del client el següent String:%s\n&amp;quot;, buf);&lt;br /&gt;
&lt;br /&gt;
    if (send(temp_sock_descriptor, buf, strlen(buf), 0) == -1) {&lt;br /&gt;
      perror(&amp;quot;Error al cridar send&amp;quot;);&lt;br /&gt;
      exit(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    close(temp_sock_descriptor);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En el client he de posar la IP del servidor al que em vull connectar&lt;br /&gt;
'''client.c'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Aquí heu de declarar l'adreça IP i número de port &lt;br /&gt;
del servidor */&lt;br /&gt;
//char * host_name = &amp;quot;127.0.0.1&amp;quot;;&lt;br /&gt;
char * host_name = &amp;quot;192.168.1.130&amp;quot;;&lt;br /&gt;
int port = 8000;&lt;br /&gt;
&lt;br /&gt;
void main(int argc, char *argv[]) {&lt;br /&gt;
  char buf[8192];&lt;br /&gt;
  char missatge[256];&lt;br /&gt;
  int socket_fd;&lt;br /&gt;
  struct sockaddr_in sin;&lt;br /&gt;
  struct hostent *server_host_name;&lt;br /&gt;
&lt;br /&gt;
  char * str;&lt;br /&gt;
&lt;br /&gt;
  if (argc != 2) {&lt;br /&gt;
    printf(&amp;quot;Utilitza: %s missatge\n&amp;quot;,argv[0]);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  } else {&lt;br /&gt;
    str = argv[1];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {&lt;br /&gt;
    perror(&amp;quot;Error creant el socket\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }  &lt;br /&gt;
&lt;br /&gt;
  if ((server_host_name = gethostbyname(host_name)) == 0) {&lt;br /&gt;
    perror(&amp;quot;Error resolent l'adreça del servidor\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  /*Inicialització de la variable sockaddr tal i com s'indica a &lt;br /&gt;
   a man 2 bind*/&lt;br /&gt;
  memset(&amp;amp;sin, 0, sizeof(sin));&lt;br /&gt;
  sin.sin_family = AF_INET;&lt;br /&gt;
  sin.sin_addr.s_addr = htonl(INADDR_ANY);&lt;br /&gt;
  sin.sin_addr.s_addr = ((struct in_addr *)(server_host_name-&amp;gt;h_addr))-&amp;gt;s_addr;&lt;br /&gt;
  sin.sin_port = htons(port);&lt;br /&gt;
&lt;br /&gt;
  if (connect(socket_fd, (void *)&amp;amp;sin, sizeof(sin)) == -1) {&lt;br /&gt;
    perror(&amp;quot;Error conectant-se al socket\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;Enviant missatge %s al servidor...\n&amp;quot;, str);&lt;br /&gt;
&lt;br /&gt;
  if (send(socket_fd, str, 8192, 0) == -1) {&lt;br /&gt;
    perror(&amp;quot;Error enviant el missatge...\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;..Misatge enviat .. esperant la resposta...\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  if (recv(socket_fd, buf, 8192, 0) == -1) {&lt;br /&gt;
    perror(&amp;quot;Error reben la resposta del servidor...\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;\nResposta del servidor: %s\n&amp;quot;, buf);&lt;br /&gt;
  &lt;br /&gt;
  close(socket_fd);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i compilem:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Compila bé excepte alguns warnings, es generer els executables ''client'' i ''server''&lt;br /&gt;
&lt;br /&gt;
Per fer la primera prova ho fem en la mateixa màquina. En un terminal obrim el server i en l'altre terminal el client:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./server&lt;br /&gt;
El servidor esta a l'espera de rebre connexions ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ./client hola&lt;br /&gt;
Enviant missatge hola al servidor...&lt;br /&gt;
..Misatge enviat .. esperant la resposta...&lt;br /&gt;
&lt;br /&gt;
Resposta del servidor: hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i en el servidor hem obtingut:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
S'ha rebut del client el següent String:hola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Faig la prova en dos ordinadors diferents, i funciona bé.&lt;br /&gt;
&lt;br /&gt;
Com que em connecto pel port 8000, des de la màquina client també em puc connectar al servidor per telnet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ telnet 192.168.1.130 8000&lt;br /&gt;
hola món&lt;br /&gt;
hola món -&amp;gt; resposta del servidor&lt;br /&gt;
GENT_PID=5477Connection closed by foreign host&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5477 és el PID (identificador del procés):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ps aux | grep server&lt;br /&gt;
joan     19274  0.0  0.0   1544   368 pts/0    S+   10:14   0:00 ./server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doncs no, el PID=19274&lt;br /&gt;
&lt;br /&gt;
per fer un scanner dels ports, i veure que el 8000 està obert (ho faig en el client):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo apt-get install nmap&lt;br /&gt;
$ nmap 192.168.1.130&lt;br /&gt;
8000/tcp open http-alt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, octubre 2008&lt;br /&gt;
[[Categoria: Llenguatge C]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>