<?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=Sessi%C3%B3_5_curs_programaci%C3%B3_linux</id>
	<title>Sessió 5 curs programació linux - 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=Sessi%C3%B3_5_curs_programaci%C3%B3_linux"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Sessi%C3%B3_5_curs_programaci%C3%B3_linux&amp;action=history"/>
	<updated>2026-08-30T08:16:11Z</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=Sessi%C3%B3_5_curs_programaci%C3%B3_linux&amp;diff=497&amp;oldid=prev</id>
		<title>Joan: New page: ﻿Sessió 5. 16-5-2008  Programació en xarxes  =================================    Mirar també la documentació sobre xarxes a la wiki del curs.  http://acacha.dyndns.org/mediawiki/ind...</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Sessi%C3%B3_5_curs_programaci%C3%B3_linux&amp;diff=497&amp;oldid=prev"/>
		<updated>2008-11-09T01:01:08Z</updated>

		<summary type="html">&lt;p&gt;New page: ﻿Sessió 5. 16-5-2008  Programació en xarxes  =================================    Mirar també la documentació sobre xarxes a la wiki del curs.  http://acacha.dyndns.org/mediawiki/ind...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;﻿Sessió 5. 16-5-2008&lt;br /&gt;
&lt;br /&gt;
Programació en xarxes&lt;br /&gt;
&lt;br /&gt;
=================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mirar també la documentació sobre xarxes a la wiki del curs.&lt;br /&gt;
&lt;br /&gt;
http://acacha.dyndns.org/mediawiki/index.php/Programació_en_xarxes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per veure les connexions de xarxa: netstat&lt;br /&gt;
&lt;br /&gt;
netstat --inet&lt;br /&gt;
&lt;br /&gt;
compte! netstat -inet significaria netstat -i -n -e -t&lt;br /&gt;
&lt;br /&gt;
quan un paràmetre és llarg, es fiquen dos guions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
netstat --inet -n en comptes de noms de màquina, posa IP'S&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Active Internet connections (w/o servers)&lt;br /&gt;
&lt;br /&gt;
Proto Recv-Q Send-Q Local Address           Foreign Address         State&lt;br /&gt;
&lt;br /&gt;
tcp        1      0 147.83.75.145:39601     147.83.194.33:80        CLOSE_WAIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
en el protocol http, cada petició obre una connexió, la processa i la tanca. Passa per tots els estats. Cada petició té un timeout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
watch netstat --inet -&amp;gt; executa la comanda cada 2 segons (paràmetre que es pot canviar)- Aleshores navego per Internet i veig com va canviatn la informació.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
watch serveix per qualsevol comanda. Per ex, watch ifconfig va mirant estadístiques de paquets rebuts i enviats (entre d'altres coses), i així veig el tràfic.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En comptes de watch també es pot fer netstat -c (mode continu, també es va executant contínuament)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$sudo netstat -puta | more -&amp;gt; ara surten més connexions. Concretament, els servidors en estat LISTEN estan escoltant peticions que els pugui arribar, com el MySQL. També ens diu el PID (id del procés)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tcp        0      0 localhost:mysql         *:*                     LISTEN     2427/mysqld&lt;br /&gt;
&lt;br /&gt;
amb aquesta informació podria matar el procés: kill 2427 -&amp;gt; mato el procés mysqld&lt;br /&gt;
&lt;br /&gt;
per tornar a obrir: /etc/init.d/mysql start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SOCKET (endoll). Estem endollant dues màquines&lt;br /&gt;
&lt;br /&gt;
A través d'un canal de comunicació (unix, tcp,...) envio informació a través del canal.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
socket linux. Per exemple:&lt;br /&gt;
&lt;br /&gt;
$ ls -la /var/run/mysqld/mysqld.sock&lt;br /&gt;
&lt;br /&gt;
srwxrwxrwx 1 mysql mysql 0 2007-05-10 07:42 /var/run/mysqld/mysqld.socksi estableixo la connexió del mysql amb un socket linux, de fet va molt més ràpid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Socket d'Internet.&lt;br /&gt;
&lt;br /&gt;
protocol (tcp, udp, raw ip)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Berkeley sockets Application Programming&lt;br /&gt;
&lt;br /&gt;
És una llibreria per desenvolupar aplicacions de xarxa amb C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
man socket&lt;br /&gt;
&lt;br /&gt;
socket() -&amp;gt; int socket(int domain, int type, int protocol);&lt;br /&gt;
&lt;br /&gt;
per TCP i UDP el protocol és 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
socket a la wiki del curs: http://acacha.dyndns.org/mediawiki/index.php/Programació_en_xarxes#socket&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bind() (lligar) -&amp;gt; hem de lligar el socket a una IP i a un port. De moment només tenim l'objecte socket (en terminologia POO). Ara falta fer alguna cosa amb ell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Codi d'exemple.&lt;br /&gt;
&lt;br /&gt;
INADDR_ANY -&amp;gt; són totes les IP de la màquina client (una màquina pot tenir varies interfícies)&lt;br /&gt;
&lt;br /&gt;
sin.sin_port = htons(port); -&amp;gt; converteix el port a hexadecimal (la manera com ho entén el sistema, veure la wiki)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen() -&amp;gt; sockets orientats a connexió (UDP no l'utilitza)&lt;br /&gt;
&lt;br /&gt;
S'ha de diferenciar el listen d'acceptar connexions.&lt;br /&gt;
&lt;br /&gt;
accept: amb el bucle while(1) estic esperant connexions (per exemple, en el cas d'Apache). Esperem connexions dels clients&lt;br /&gt;
&lt;br /&gt;
és així com es programen els dimonis, per exemple el dimoni de l'Apache.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ps aux | grep apache -&amp;gt; un apache de fet té molts processos oberts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
recv -&amp;gt; receive&lt;br /&gt;
&lt;br /&gt;
send&lt;br /&gt;
&lt;br /&gt;
treballen amb un buffer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemple client-servidor. Servidor d'echos.&lt;br /&gt;
&lt;br /&gt;
------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Instal.lem Java + Eclipse + Subversion (seguir els passos de l'enllaç en la sessió 5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
modifiquem el client.c i li fiquem la IP del servidor. Compilem&lt;br /&gt;
&lt;br /&gt;
aleshores:&lt;br /&gt;
&lt;br /&gt;
./server -&amp;gt; el servidor es posa a l'espera&lt;br /&gt;
&lt;br /&gt;
./client hola -&amp;gt; en el client es notifica, i en el servidor, que està a l'espera, també es notifica.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
També es pot fer amb telnet:&lt;br /&gt;
&lt;br /&gt;
em connecto al servidor de la companya:&lt;br /&gt;
&lt;br /&gt;
$ telnet 147.83.75.144 8000 -&amp;gt; com que hi ha un procés, el servidor està escoltant. Escric, i em contesta el servidor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nmap 147.83.75.144&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install nmap&lt;br /&gt;
&lt;br /&gt;
-&amp;gt; fa un scanner de ports, i veig que el 8000 està obert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
Faig telnet www.upc.edu 80&lt;br /&gt;
&lt;br /&gt;
està a l'espera. escric index.html i em dóna la resposta&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Canviem d'exemple: udp. Enviar missatges&lt;br /&gt;
&lt;br /&gt;
-----------------------&lt;br /&gt;
&lt;br /&gt;
Provem també el client i el servidor.&lt;br /&gt;
&lt;br /&gt;
Experiència: mentre rebem els paquets, desconnectem físicament el cable de xarxa, i el tornet a connectar. Veurem que s'han perdut paquets, doncs el protocol udp és més ràpid, a costa de què no assegura la integritat de la informació (es perden paquets).&lt;br /&gt;
&lt;br /&gt;
Ara ho fem funcionar pel port 6789&lt;br /&gt;
&lt;br /&gt;
  // set using SOCK_DGRAM for UDP:&lt;br /&gt;
&lt;br /&gt;
  if ((socket_descriptor = socket(PF_INET, SOCK_DGRAM, 0)) == -1) {&lt;br /&gt;
&lt;br /&gt;
    perror(&amp;quot;Error obrint el socket\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    exit(1);&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
./receive: /lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.4' not found (required by ./receive) -&amp;gt; vol dir que li falta algun paquet per instal.lar:&lt;br /&gt;
&lt;br /&gt;
sudo apt-get install libc6-dev&lt;br /&gt;
&lt;br /&gt;
ln -al /lib/tls/i686/cmov/libc.so.6&lt;br /&gt;
&lt;br /&gt;
No s'instal.la bé. com es soluciona?&lt;br /&gt;
&lt;br /&gt;
make clean -&amp;gt; esborra els executables&lt;br /&gt;
&lt;br /&gt;
make -&amp;gt; torno a generar els executables&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Important!!&lt;br /&gt;
&lt;br /&gt;
El procés de compilació en C&lt;br /&gt;
&lt;br /&gt;
llegir a: http://atenea.upc.edu/moodle/mod/resource/view.php?id=288596&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt; -&amp;gt; on està stdio.h? està a /lib&lt;br /&gt;
&lt;br /&gt;
find /lib -name include -print&lt;br /&gt;
&lt;br /&gt;
whereis stdio&lt;br /&gt;
&lt;br /&gt;
stdio: /usr/include/stdio.h /usr/share/man/man3/stdio.3.gz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Important! Si a Ubuntu no es troba stdio.h i les altres llibreries, és perquè no està instal.lat:&lt;br /&gt;
&lt;br /&gt;
$ sudo apt-get install libc6-dev&lt;br /&gt;
&lt;br /&gt;
i ho solucionem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    if (iter &amp;gt;20) { -&amp;gt; canviem per un número més gros. Per ex, 50&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
fiquem en el receive.c la meva IP (147.83.75.145), i en el send.c la seva (147.83.75.144)&lt;br /&gt;
&lt;br /&gt;
./receive -&amp;gt; es posa a escoltar&lt;br /&gt;
&lt;br /&gt;
./send -&amp;gt; envia tota la iteració de paquets.&lt;br /&gt;
&lt;br /&gt;
Per pantalla es veu:&lt;br /&gt;
&lt;br /&gt;
Resposta del servidor:&lt;br /&gt;
&lt;br /&gt;
paquet de dades amb l'identificador: 11 (de 1...50), que és el que m'ha enviat el send.c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dimonis&lt;br /&gt;
&lt;br /&gt;
==================&lt;br /&gt;
&lt;br /&gt;
programaciodimonislinux.pdf&lt;br /&gt;
&lt;br /&gt;
Aplicació informàtica o procés que s'executa en segon pla.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echod.c&lt;br /&gt;
&lt;br /&gt;
compilem i l'executem. S'hauria de veure en el monitor del sistema&lt;br /&gt;
&lt;br /&gt;
(el codi de la solució no m'ha funcionat, l'altre sí)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ps aux | grep echod -&amp;gt; veig que s'executa, i també ho veig en el monitor&lt;br /&gt;
&lt;br /&gt;
cursice  12852  0.0  0.0   1428   244 ?        S    15:32   0:00 ./echod  -&amp;gt; és aquest!&lt;br /&gt;
&lt;br /&gt;
cursice  12923  0.0  0.1   2848   700 pts/1    R+   15:34   0:00 grep echod&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
en el fitxer echod.c puc ficar sleep(10) (10 segons) abans del fork, i així controlar com es creen els fills (?. estudiar!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
per matar-lo, kill -9 12852&lt;br /&gt;
&lt;br /&gt;
(o bé pidof echod)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En el monitor de processos, fico damunt(que sempre estigui en primer pla), veure tots els processos, i veure dependències (per veure quin és el pare i quin és el fill).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
si surten caràcters extranys: reset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
per veure el pid del pare:&lt;br /&gt;
&lt;br /&gt;
ps -elf&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>