Blame view

JChatClient/doc/html/howto.html 9.34 KB
1
2
3
4
5
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
6
<meta name="generator" content="Doxygen 1.8.4"/>
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<title>Socket: HOWTO</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Socket
   </div>
   <div id="projectbrief">Librería para comunicar via TCP/IP</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
34
<!-- Generado por Doxygen 1.8.4 -->
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Buscar');
</script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Página&#160;principal</span></a></li>
      <li class="current"><a href="pages.html"><span>Páginas&#160;relacionadas</span></a></li>
      <li><a href="annotated.html"><span>Clases</span></a></li>
      <li><a href="files.html"><span>Archivos</span></a></li>
      <li>
        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Buscar" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
      </li>
    </ul>
  </div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>Todo</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Clases</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Archivos</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Funciones</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>&apos;defines&apos;</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Páginas</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">HOWTO </div>  </div>
</div><!--header-->
<div class="contents">
<div class="toc"><h3>Tabla de contenidos</h3>
<ul><li class="level1"><a href="#proto">Descripción del protocolo</a><ul><li class="level2"><a href="#plain">Modo en texto llano</a></li>
<li class="level2"><a href="#send">Envío/Recepción de mensajes</a></li>
</ul>
</li>
<li class="level1"><a href="#compile">Compilación</a><ul><li class="level2"><a href="#defines">Opciones de compilación</a></li>
<li class="level2"><a href="#flags">Flags de compilación y librerías</a></li>
</ul>
</li>
91
<li class="level1"><a href="#examples">Ejemplos</a><ul><li class="level2"><a href="#server">Programar un cliente</a></li>
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
</ul>
</li>
</ul>
</div>
<div class="textblock"><p>Descripción de funcionamiento y uso de la librería.</p>
<pre class="fragment">    A continuación se desglosan las instrucciones para el desarrollo con esta libería y su posterior uso.
    &lt;br&gt;&lt;br&gt;
</pre> <h1><a class="anchor" id="proto"></a>
Descripción del protocolo</h1>
<p>En las comunicaciones con Sockets hay un problema, es fácil saber la longitud del mensaje que vas a enviar, pero cuesta saber la longitud del mensaje que deseas recibir, ya que la transmisión se puede detener por llegar al fin del mensaje o bien por que hay problemas en la red.</p>
<p>Los sockets de UNIX nos dan una solución, que es usar llamadas no bloqueantes para recibir el mensaje, es decir: Si leo de un socket, y no he llenado el buffer donde guardo los datos que recibo de allí, la aplicación no se bloquea esperando recibir la suficiente cantidad de datos. A su vez, se usan llamadas a la función <a href="http://linux.die.net/man/2/select">select()</a> para comprovar si hay datos disponibles a para leer o la conexión está terminada.</p>
<p>Esto requiere uso de la forks e ir haciendo encuesta (polling) al socket, cosa que consume más recursos del sistema.</p>
<p>Debido a la complejidad añadida que supone hacerlo por esta vía, ya que la librería usa threads que son más ligeros para el sistema y la memoria RAM; se ha optado por implementar un sencillísimo protocolo de comunicación que no supone gasto de computación y repercute de forma nímia en el rendimiento de la transferencia.</p>
<p><br/>
 </p>
<h2><a class="anchor" id="plain"></a>
Modo en texto llano</h2>
<p>Este modo transmite los carácteres de texto sin ningún tipo de encriptación, por lo tanto son totalmente visibles para cualquier agente intermedio. Sin embargo, el modo sin encriptación es más rápido y ofrece el doble de velocidad de transferencia aproximadamente. <br/>
 </p>
<h2><a class="anchor" id="send"></a>
Envío/Recepción de mensajes</h2>
<p>El mensaje se transmite de la siguiente forma:</p>
<ol type="1">
<li>Bob le quiere mandar a Alice un mensaje, primero primero pone el número de carácteres (bytes) que ocupa el mensaje en forma de string terminado con carácter NULL ('\0') y lo manda.</li>
<li>Bob transmite el mensaje íntegro.</li>
<li>Alice lee uno a uno los carácteres del socket hasta encontrar un carácter NULL ('\0'), entonces lee lo que ha recibido, que es la longitud del mensaje real.</li>
<li>Alice pasa a extraer los N bytes que ha leído que recibiría y obtiene el mensaje final. <br/>
 <br/>
 <br/>
 </li>
</ol>
<h1><a class="anchor" id="compile"></a>
Compilación</h1>
<p>A continuación se detallan las opciones e instrucciones necesarias para compilar esta librería. <br/>
 </p>
<h2><a class="anchor" id="defines"></a>
Opciones de compilación</h2>
<p>Los siguientes #defines establecen la configuración en tiempo de compilación</p>
<ul>
<li>RSALENGTH : La longitud de la llave RSA que se usará.</li>
<li>AESLENGTH : La longitud de la llave AES que se usará.</li>
133
<li><a class="el" href="server_8h.html#ad22e7f0ef164a8dafb32f779f737a1bd">CONFFILE</a> : La ruta absoluta o relativa al fichero de configuración del servidor (véase: conf).</li>
134
135
<li>PUBLICKEY : La ruta absoluta o relativa a la llave pública RSA. Existe en <a class="el" href="server_8h.html" title="Header de la clase Server. ">server.h</a> y <a class="el" href="client_8cpp.html" title="Fichero de implementación de un cliente. ">client.cpp</a></li>
<li>PRIVATEKEY : La ruta absoluta o relativa a la llave pública RSA. Existe en <a class="el" href="server_8h.html" title="Header de la clase Server. ">server.h</a> y <a class="el" href="client_8cpp.html" title="Fichero de implementación de un cliente. ">client.cpp</a> <br/>
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
 </li>
</ul>
<h2><a class="anchor" id="flags"></a>
Flags de compilación y librerías</h2>
<p>Flags de compilación necesarios:</p>
<ul>
<li>-I/carpeta/con/cabeceras_de/crypto++ -I/carpeta/con/cabeceras/de_la/librería/Socket</li>
<li>-L/carpeta/con/la_librería/crypto++</li>
<li>-lcryptopp -lpthread</li>
</ul>
<p>Véase: makefile <br/>
 <br/>
 <br/>
 </p>
<h1><a class="anchor" id="examples"></a>
Ejemplos</h1>
<p>A continuación se detalla el código para programar una aplicación servidor cliente sencilla <br/>
 </p>
<h2><a class="anchor" id="server"></a>
Programar un cliente</h2>
156
<p>Véase: <a class="el" href="client_code.html">Client</a> <br/>
157
158
159
160
161
 <br/>
 </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
162
Generado el Sábado, 7 de Diciembre de 2013 03:17:07 para Socket por &#160;<a href="http://www.doxygen.org/index.html">
163
<img class="footer" src="doxygen.png" alt="doxygen"/>
164
</a> 1.8.4
165
166
167
</small></address>
</body>
</html>