Sockets en Unix

Embed Size (px)

Citation preview

SocketsenUnixUnsocketesunpuntodecomunicacinatravsdelcualunprocesopuedecomunicarse conotroparacompartirinformacin.Estosprocesospuedenperteneceralmismosistema (procesoslocales)oencontrarseensistemasdiferentes(procesosremotos). Los sockets de Berkeley son las APIs (Application Programming Interface) de comunicacionesmscomunesensistemasUnix,aunqueyaseestnocupandoentodos lossistemasoperativosexistentes. Unsocket,tambin,sepuedevercomounarepresentacinabstractaqueseencuentraen unextremodeunaaplicacinyqueseutilizaparalacomunicacinbidireccionalentredos procesos y es capaz de ofrecer una interfaz para acceder a los servicios de la red en la capadetransporte. Socket Cliente Socket Servidor

Unsocketesunelementolgicoquetieneasociado2principalescosasyunatercerasise requierequeunhostsecomuniqueconotroenlared: 1. Una direccin IP que ayuda a identificar al host fsico que en la red el cual est ejecutandoelprocesoquesequierecomunicarconotroproceso. 2. Unpuertoqueesunainterfazoelementofinalatravsdelcualdiferentestiposde datos se pueden enviar y recibir. Existen dos tipos de puertos fsicos (que sirven paraconectardispositivosfsicos)ylgicosqueenelmbitodeInternet,unpuerto eselvalorqueseusa,enelmodelodelacapadetransporte,paradistinguirentre lasmltiplesaplicacionesquesepuedenconectaralmismohost.Aunquemuchos de los puertos se asignan de manera arbitraria aunque existen puertos bien conocidos que se utilizan para ciertas aplicaciones particulares o servicios de carcter universal se puedan comunicar. De hecho, la IANA (Internet Assigned Numbers Authority) determina, las asignaciones de todos los puertos comprendidosentrelosvalores[0,1023].

3. Un protocolo de comunicacin, existen dos modos para conectar a travs de sockets:1)modoorientadoaconexin,brindaunaconexinseguraparaelenvoy recepcin de informacin y 2) modo no orientado a conexin, en este modo los procesos no necesitan establecer una conexin con el otro host para poder enviarleinformacin.Msadelantehablaremosdelosprotocolosquerealizanesta funcin.

El modelo ms comn y utilizado para establecer la comunicacin entre dos procesoseselclienteservidor.Laarquitecturaclienteservidorconsistebsicamenteen unclientequerealizapeticionesaotroprograma(elservidor)queledarespuesta. Alprocesoquerealizaalgntipodepeticinosolicitudaotroprocesoseleconoce comoclienteyalprocesoquesiempreestalaescuchadepeticionesyqueenvaalgn tipoderespuestaaesaspeticionesseleconocecomoservidor. La separacin entre cliente y servidor es una separacin de tipo lgico, donde el servidornoseejecutanecesariamentesobreunasolamquinaniesnecesariamenteun sloprograma.Unadisposicincomnenestemodeloesqueelservidorsedescompone en diferentes programas que pueden ser ejecutados por diferentes computadoras aumentandoaselgradodedistribucindelsistema. Unpuertoderedpuedeadoptarlossiguientesestados: Abierto. El puerto puede recibir conexiones. Un pequeo programa, conocido como servidor, se encuentra continuamente escuchando a la espera de recibir peticiones para establecer una comunicacin e intercambiar datos con otro PC remoto. Cerrado. Las conexiones se rechazan. En este caso es probable que no exista ningunaaplicacinescuchandoporesepuertoonosepermiteelaccesoporalgn

motivo concreto. A este estado se le considera como el comportamiento normal delsistemaoperativo. Bloqueado o sigilosos. En este estado no es posible saber si el ordenador esta conectado.Seleconsideracomoelestadoideal.Amenudoesteestadosedebea la existencia de un cortafuegos o simplemente a que el ordenador se encuentra apagado.

LasiguientetablamuestralalistadepuertosTCP/IPbienconocidos:

Puerto/protocolo Descripcinn/d/GRE n/d/ESP n/d/AH 1/tcp 7/tcp 7/udp 9/tcp 9/udp 13/tcp 17/tcp 19/tcp 19/udp 20/tcp 21/tcp 22/tcp 23/tcp 25/tcp 37/tcp 43/tcp 53/tcp 53/udp 67/udp 68/udp 69/udp 70/tcp 79/tcp 80/tcp GRE(protocoloIP47)Enrutamientoyaccesoremoto IPSecESP(protocoloIP50)Enrutamientoyaccesoremoto IPSecAH(protocoloIP51)Enrutamientoyaccesoremoto MultiplexorTCP ProtocoloEcho(Eco)Repondeconecoallamadasremotas ProtocoloEcho(Eco)Repondeconecoallamadasremotas ProtocoloDiscardEliminacualquierdatoquerecibe ProtocoloDiscardEliminacualquierdatoquerecibe ProtocoloDaytimeFechayhoraactuales QuoteoftheDay(CitadelDa) ProtocoloChargenGeneradordecaracteres ProtocoloChargenGeneradordecaracteres FTP File Transfer Protocol (Protocolo de Transferencia de Ficheros)datos FTP File Transfer Protocol (Protocolo de Transferencia de Ficheros)control SSH,scp,SFTP Telnetmanejoremotodeequipo,inseguro SMTP Simple Mail Transfer Protocol (Protocolo Simple de TransferenciadeCorreo) time(comando) nicname DNSDomainNameSystem(SistemadeNombresdeDominio) DNSDomainNameSystem(SistemadeNombresdeDominio) BOOTPBootStrapProtocol(Server),tambinusadoporDHCP BOOTPBootStrapProtocol(Client),tambinusadoporDHCP TFTP Trivial File Transfer Protocol (Protocolo Trivial de TransferenciadeFicheros) Gopher Finger HTTPHyperTextTransferProtocol(ProtocolodeTransferenciade

88/tcp 110/tcp 111/tcp 113/tcp 119/tcp 123/udp 123/tcp 135/tcp 137/tcp 137/udp 138/tcp 138/udp 139/tcp 139/udp 143/tcp 161/tcp 161/udp 162/tcp 162/udp 177/tcp 177/udp 389/tcp 389/udp 443/tcp 445/tcp 445/udp 500/udp 512/tcp 513/tcp 514/udp 520/udp 591/tcp 631/tcp 666/tcp 993/tcp 995/tcp 1080/tcp 1337/tcp

HiperTexto)(WWW) KerberosAgentedeautenticacin POP3PostOfficeProtocol(Email) sunrpc ident(auth)antiguosistemadeidentificacin NNTPusadoenlosgruposdenoticiasdeusenet NTPProtocolodesincronizacindetiempo NTPProtocolodesincronizacindetiempo epmap NetBIOSServiciodenombres NetBIOSServiciodenombres NetBIOSServiciodeenvodedatagramas NetBIOSServiciodeenvodedatagramas NetBIOSServiciodesesiones NetBIOSServiciodesesiones IMAP4InternetMessageAccessProtocol(Email) SNMPSimpleNetworkManagementProtocol SNMPSimpleNetworkManagementProtocol SNMPtrap SNMPtrap XDMCPProtocolodegestindedisplaysenX11 XDMCPProtocolodegestindedisplaysenX11 LDAPProtocolodeaccesoligeroaBasesdeDatos LDAPProtocolodeaccesoligeroaBasesdeDatos HTTPS/SSLusadoparalatransferenciaseguradepginasweb MicrosoftDS(ActiveDirectory,comparticinenWindows,gusano Sasser,Agobot) MicrosoftDScomparticindeficheros IPSecISAKMP,AutoridaddeSeguridadLocal exec login syslogusadoparalogsdelsistema RIP FileMaker6.0(alternativaparaHTTP,verpuerto80) CUPSsistemadeimpresindeUnix identificacindeDoomparajugarsobreTCP IMAP4sobreSSL(Email) POP3sobreSSL(Email) SOCKSProxy sueleusarseenmquinascomprometidasoinfectadas

1352/tcp 1433/tcp 1434/tcp 1434/udp 1494/tcp 1512/tcp 1521/tcp 1701/udp 1723/tcp 1761/tcp 1863/tcp 1935/??? 2049/tcp 2082/tcp 2086/tcp 2427/upd 3030/tcp 3030/upd 3128/tcp 3128/tcp 3306/tcp 3389/tcp 3396/tcp 3690/tcp 4662/tcp 4672/udp 4899/tcp 5000/tcp 5060/udp 5190/tcp 5222/tcp 5223/tcp 5269/tcp 5432/tcp 5517/tcp 5631/tcp 5632/udp 5400/tcp 5500/tcp

IBMLotusNotes/DominoRCP MicrosoftSQLServer MicrosoftSQLMonitor MicrosoftSQLMonitor CitrixMetaFrameClienteICA WINS Oraclelistenerpordefecto EnrutamientoyAccesoRemotoparaVPNconL2TP. EnrutamientoyAccesoRemotoparaVPNconPPTP. NovellZenworksRemoteControlutility MSNMessenger FMSFlashMediaServer NFSArchivosdelsistemadered CPanelpuertopordefecto WebHostManagerpuertopordefecto CiscoMGCP NetPanzer NetPanzer HTTPusadoporwebcachesypordefectoenSquidcache NDLAAS MySQLsistemadegestindebasesdedatos RDP(RemoteDesktopProtocol) NovellagentedeimpresinNDPS Subversion(sistemadecontroldeversiones) eMule(aplicacindecomparticindeficheros) eMule(aplicacindecomparticindeficheros) RAdmin (Remote Administrator), herramienta de administracin remota(normalmentetroyanos) Universalplugandplay SessionInitiationProtocol(SIP) AOLyAOLInstantMessenger Jabber/XMPPconexindecliente Jabber/XMPPpuertopordefectoparaconexionesdeclienteSSL Jabber/XMPPconexindeservidor PostgreSQLsistemadegestindebasesdedatos SetiqueueproyectoSETI@Home PCAnywhereprotocolodeescritorioremoto PCAnywhereprotocolodeescritorioremoto VNCprotocolodeescritorioremoto(usadosobreHTTP) VNCprotocolodeescritorioremoto(usadosobreHTTP)

5600/tcp 5700/tcp 5800/tcp 5900/tcp 6000/tcp 6112/udp 6129/tcp 6346/tcp 6347/udp 6348/udp 6349/udp 6350/udp 6355/udp 6667/tcp 6881/tcp 6969/tcp 7100/tcp 7100/udp 8000/tcp 8080/tcp 8118/tcp 9009/tcp 9898/tcp 10000/tcp 19226/tcp 12345/tcp 31337/tcp

VNCprotocolodeescritorioremoto(usadosobreHTTP) VNCprotocolodeescritorioremoto(usadosobreHTTP) VNCprotocolodeescritorioremoto(usadosobreHTTP) VNCprotocolodeescritorioremoto(conexinnormal) X11usadoparaXwindows Blizzard DamewareSoftwareconexinremota Gnutellacomparticindeficheros(Limewire,etc.) Gnutella Gnutella Gnutella Gnutella Gnutella IRCIRCUInternetRelayChat BitTorrentpuertopordefecto BitTorrentpuertodetracker ServidordeFuentesX11 ServidordeFuentesX11 iRDMI por lo general, usado errneamente en sustitucin de 8080.TambinutilizadoenelservidordestreamingShoutCast. HTTP HTTPALT ver puerto 80. Tomcat lo usa como puerto por defecto. privoxy Pichatpeertopeerchatserver GusanoDabber(troyano/virus) Webmin(Administracinremotaweb) PandaSecurityPuertodecomunicacionesdePandaAgent. NetBusen:NetBus(troyano/virus) Back Orifice herramienta de administracin remota (por lo generaltroyanos)

Unsocketpuedeservistocomoun"archivo"queseabredeunamaneraespecial.Unavez abierto se pueden escribir y leer datos de l con las habituales funciones de read() y write() e igual que con los archivos, tiene asociado un descriptor que contendr la informacinnecesariaasociadaalsocket. Para crear un socket, se recurrir a las funciones que nos facilita el API de sockets, concretamenteseharreferenciaalafuncinsocket()quenosdevolvereldescriptor delsocketcreadoounvalorde1encasodeerror.

Undescriptoresunaestructuradedatoscontodoslosparmetrosasociadosalsocket,un descriptordeunsocketesmuyparecidoaldescriptordeunarchivo,porejemplo,algunos datosasociadosaldescriptordelarchivopodranser:

Nombresimblicodelarchivo. Localizacindelarchivoenelalmacenamientosecundario. Organizacindelarchivo(mtododeorganizacinyacceso). Tipodedispositivo. Datosdecontroldeacceso. Tipo(archivodedatos,programaobjeto,programafuente,etc.). Disposicin(permanentecontratemporal). Fechaytiempodecreacin. Fechadedestruccin. Fechadelaltimamodificacin. Sumadelasactividadesdeacceso(nmerodelecturas,porejemplo).

Lafuncinsockettienelasiguienteestructura: intsocket(intdomain,inttype,intprotocol); dnde: domain: Especifica un dominio de comunicaciones seleccionando una familia de protocolos.Estasfamiliassedefinenen. Nombre Propsito PF_UNIX,PF_LOCAL Comunicacinlocal PF_INET PF_INET6 PF_IPX PF_NETLINK PF_X25 PF_ATMPVC PF_APPLETALK PF_PACKET ProtocolosdeInternetIPv4 ProtocolosdeInternetIPv6 ProtocolosIPXNovell Dispositivo de la interfaz de usuario del ncleo ProtocoloITUTX.25/ISO8208 AccesodirectoaPVCsATM Appletalk Interfazdepaquetesdebajonivel

Undominiodefinebsicamentedoscaractersticas: La familia de protocolos que estarn disponibles para arbitrar el intercambio de datosentredossockets.

Elformatodelasdireccionesderedqueseusarnparaidentificarambosextremos delacomunicacin.

Losdominiosmscomunesson: Dominio de Unix: los sockets de este dominio son locales al sistema donde son creados. Permiten la comunicacin interna entre procesos (son los elementos conocidos como pipes). Se identifican por las constantes PF_LOCAL, PF_UNIX y PF_FILE. Dominio de Internet: los sockets de este dominio se identifican por la constante PF_INET, dando lugar a la comunicacin entre procesos a travs de una red TCP/IP. Existenmsdominios,restringidosaaplicacionesmsespecficas,porejemplo: 1. PF_AX.25paracomunicacionesporradio. 2. PF_IPXparacomunicacionesconelprotocoloIPXdeNivell. 3. PF_APPLETALKparacomunicacionesconelprotocoloAppleTalk 4. PF_X25paracomunicacionesX.25 5. PF_INET6paracomunicacionesconelprotocoloIPv6 type: Es el conector que tiene el tipo indicado que especifica la semntica de la comunicacin.Lostiposdefinidosenlaactualidadson: Nombre Funcin SOCK_STREAM Proporciona flujos de bytes basados en una conexin bidireccionalsecuenciada,confiable.Sepuedeadmitirun mecanismodetransmisindedatosfueradebanda. SOCK_DGRAM Admite datagramas (mensajes no confiables, sin conexin,deunalongitudmximafija). SOCK_SEQPACKET Proporciona un camino de transmisin de datos basado en conexin bidireccional secuenciado, confiable, para datagramas de longitud mxima fija; se requiere un consumidor para leer un paquete entero con cada llamadaalsistemadelectura. SOCK_RAW Proporcionaaccesodirectoalosprotocolosdered. SOCK_RDM Proporciona una capa de datagramas fiables que no garantizaelorden. protocol: Especifica un protocolo particular para ser usado con el conector. Normalmentesloexisteunprotocoloqueadmitauntipoparticulardeconectordentro

de una familia de protocolos dada, sin embargo al no conocer el nmero indicado de acuerdo a la familia se puede especificar como cero 0 para dejar al sistema operativo establezcaelprotocoloadecuadoteniendoencuentalafamiliaseleccionadayeltipode socketindicadoanteriormente.

DominiodeInternet ParaeldominiodeInternet,seusaranfuncionesconocidascomoconnect(),accept() obind()quetomancomoparmetrounapuntadoraunaestructuragenricasockaddr querepresentaladireccindeunsocket. Ladefinicindelaestructurasockaddreslasiguiente: structsockaddr{ unsignedshortsa_family;/*familiadedirecciones,AF_XXX*/ charsa_data[14];/*14bytesparaladireccindelprotocolo*/ };

Otraestructuraqueseutilizaconunsocketeslaestructurasockaddr_inqueespecfica elformatodeladireccindelsocket,paraladefinicindeestaestructuraeneldominio PF_INETconsultarelarchivo:

Definicindelaestructurasockaddr_in #define__SOCK_SIZE__16/*sizeof(structsockaddr)*/ structin_addr{ __u32s_addr; }; structsockaddr_in{ shortint sin_family; unsignedshort int sin_port; structin_addr sin_addr; unsignedchar __pad[__SOCK_SIZE__sizeof(shortint) sizeof(unsignedshortint) sizeof(structin_addr)]; }; #definesin_zero__pad }

LadireccindeunsocketparaInternetconstarde: Ladefinicin,enelcamposin_family,elvalorqueseusarenestecamposer AF_INET. La definicin, en el campo sin_port, del puerto TCP/IP al cual se conectara el proceso o que se usar para recibir conexiones, dependiendo si se trata de un clienteounservidor. La definicin, en el campo sin_addr, de la direccin IP del host al cual se conectarelproceso,odelaqueseesperaconexionesodatos. El campo sin_zero, es un campo de relleno que sirve para adaptar la estructura sockaddr_inalaestructuragenricasockaddrqueeslaqueseesperacomo parmetroenlasfunciones.Normalmentesehaceuncastingdeunapuntadorde unaestructuraparticularsockaddr_inaunapuntadoraunaestructuragenrica sockaddr.

Tiposdesockets El tipo de socket especificar ciertas caractersticas acerca de la comunicacin que se llevaracaboatravsdelossockets.Algunascaractersticaspuedenser: Comunicacinorientadaaconexin:Antesdecomenzarelintercambiodedatos se establece una conexin entre los dos extremos, este tipo de conexin es bloqueante ya que la conexin permanecer establecida mientras dure la conexin.EstetipodeconexinserealizautilizandoelprotocoloTCP,porlotanto, laconexinserealizaenunprocesodenominadothreewayhandshake(saludoen tresfases). Para realizar el proceso de conexin threeway handshake, todo servidor debe estar preparadopararecibirunapeticindeconexin.Esteprocesosellevaacabomediantelas llamadasalasfunciones:socket(),bind()ylisten(). Cuando el cliente realiza una llamada a connect(), enva un segmento al servidor solicitandoabriruncircuitovirtualTCP.Dichosegmentollevaen1labanderaSYN,para indicarqueelqueelcircuitovirtualestenprocesodesincronizacin.Estesegmentono llevaningntipodedatos,nicamenteelencabezadoIP,elencabezadoTCPylasposibles opcionesTCP. Elservidorrespondeenviadounsegmentodeaceptacinalsegmentoanterior.Paraello pone en 1 la bandera ACK y en el campo nmero de secuencia ACK coloca el valor correspondientealcamponmero de secuenciadelsegmentorecibidoperoincrementado en 1. La bandera SYN tambin el servidor la coloca a 1 para indicar al cliente que el proceso de sincronizacin no ha finalizado. En este momento, el cliente recibe el segmentodedatosysabequeelservidorhavalidadosupeticin,peroahoraelclientees

elquedebeenviarunavalidacinalcampoSYNqueenvielservidor.Paraelloelcliente envaunsegmentocolocandoelvalorcorrespondienteenelcamponmero de secuencia ACKyactivandolabanderaACK.ParaestemensajelabanderaSYNnovaactiva.Llegadoa estepuntolaconexinTCPsehaestablecido.

Conexinthreewayhandshake

Tambinelprocesodedesconexinenunacomunicacinorientadaaconexindebeser demaneraordenada,esteprocesosellevaacaboen4fases: 1. Cuandounhostdeseafinalizarlaconexin,generaunallamadaaclose(),esto generaunenvodeunsegmentoconlabanderaFINen1. 2. Almomentoderecibirestapeticin,elservidordebevalidarcualquierinformacin previamedianteelenvodeunsegmentoconlabanderaACKen1. 3. Cuandoelclienterecibeestereconocimiento,entoncesestpreparadoparacerrar laconexin,sinembargo,debeesperaraqueelservidorenviunsegmentoconla banderaFINactiva. 4. El cliente tras recibir un segmento del servidor con la bandera FIN activa, entonces,lavalidarenviandounACKalservidoryenesemomentoseterminar laconexin.

Diagramadeltrminodeunaconexin.

Comunicacin no orientada a conexin: No se establece una conexin previa entrelosextremos,sinoqueunodeellosenvadirectamenteunmensajealotro extremo. Para realizar este tipo de comunicacin se utiliza el protocolo UDP. DebidoaqueUDPnoesorientadoaconexin,serlaaplicacinlaresponsablede llevar a cabo el reenvo de todos los paquetes que se han perdido, as como el ensamblado de la informacin en un orden correcto. Esto no puede ser una desventaja en aplicaciones simples que no requieren de un excesivo envo de informacin.Paraestetipodeaplicacionesseutilizanlasfuncionesrecvfrom()y sendto(). Fiabilidad de la transmisin: Es el grado de confianza en el que no se pierde la informacin antes de llegar al su destino. Las comunicaciones orientadas a conexintienenelgradodefiabilidadmsalto. Recepcin ordenada de la informacin: Especifica si los datos se recibirn en el mismoordenenquefueronenviados.Orientadasaconexinserecibenenordeny lasnoorientadasaconexinnosegarantizaesterubro. Duplicidaddedatos:Esalgoquesedebecuidarcuandoserealizanconexionesno orientadasaconexin.Enlasorientadasaconexinsecontrolaesteaspecto. Conocimiento en recepcin del tamao de datos: En conexiones orientadas a conexin se recibe un flujo continuo de datos, siendo responsabilidad de la aplicacin dividir este flujo en informacin en mensajes. En conexiones no orientadasaconexinserecibeunmensajeaislado,loquepermiteelcontroldel tamao del mismo y su aislamiento respecto a otros mensajes que se puedan recibir. Envo de datos urgentes: Son datos denominados fuera de flujo/banda (out of band).Estosdatossepasandirectamentealacapadeaplicacinynoestnsujetos alcontroldeflujojuntoalosotrosdatos.

Funcionesdeordenamientodebytes Cuando dos hosts se comunican a travs de Internet mediante un protocolo concreto, debenhacerlodeformaindependientealarepresentacininternaquecadahosthagade los datos recibidos y enviados. Por tanto, debe existir una representacin local y una representacindereddelosdatos.Unhost,antesdeenviarundato,deberconvertirlo desdesurepresentacinlocalaladered,delotroladoelhostrecibirlosdatosenuna representacinderedyharlaconversinaunarepresentacinlocalparticular. La familia de protocolos TCP/IP ha adoptado como representacin de red el formato conocidocomobig endianparalarepresentacindeenterosde16y32bits.Lasfunciones disponiblesparaestaconversinson: htonl():host-to-network long integer.Conversindeunenterolargode32bits desurepresentacinlocalaldered.

htons():host-to-network short integer.Conversindeunenterocortode16bits desurepresentacinlocalaldered. ntohl():network-to-host long integer.Conversindeunenterolargode32bits desurepresentacinderedallocal. ntohs():network-to-host short integer.Conversindeunenterocortode16bits desurepresentacinderedallocal.

Prototiposdelasfunciones: #include unsignedlonginthtonl(unsignedlonginthostlong); unsignedshortinthtons(unsignedshortinthostshort); unsignedlongintntohl(unsignedlongintnetlong); unsignedshortintntonhs(unsignedshortintnetshort);

Primitivasdeunsocket.Los sockets utilizan principalmente dos formas de entablar una comunicacin, el orientado a conexin (TCP) y en no orientado a conexin (UDP). Cada uno de ellos requieredeunprocesodiferentepararealizarlaconexin,esdecirrealizanunllamadoa diferentesprimitivasdelaAPIdesockets. Procesodellamadasaprimitivasencomunicacinorientadaaconexin.

ProcesodellamadasaprimitivasencomunicacinNOorientadaaconexin.

Todoslossocketsproporcionanunaseriedeprimitivas,lascualesestnorientadasaser utilizadas por sus usuarios, de forma que se pueda establecer una comunicacin determinada, y marcar las pautas dentro de la misma. Cada socket puede ser usado de mltiplesformasypordiferentesusuarios.Acontinuacinseexplicanlasprimitivasms importantes. socket() Permitelacreacindeunsocket.Lafuncindevuelveundescriptordelsocketounvalor de1encasodeerror. Laformageneraldelaprimitivaquepermitecrearunsocketyobtenerundescriptorpara utilizarloes: intsocket(intdominio,inttipo,intprotocolo); Dnde: dominio= /*AF_INET,AF_UNIX,...*/ tipo= /*SOCK_DGRAM,SOCK_STREAM,...*/ protocolo= /*0:protocolopordefecto*/ El primer parmetro especifica la familia de sockets que se desea emplear. El segundo parmetroespecificaeltipodesocket.Eltercerparmetroespecificaelprotocoloquese va a usar en el socket. Normalmente, cada tipo de socket tiene asociado slo un protocolo, pero si hubiera ms de uno, se especificara mediante este argumento. Generalmente su valor es 0, en cuyo caso se deja la eleccin del protocolo al sistema operativo. Si la llamada a la funcin socket() devuelve 1, se puede obtener la causa exacta del problemaconsultandolavariableerrnoquepuedetomarvalorescomo: EPROTONOSUPPORT: El tipo de protocolo indicado no est soportado dentro del dominioespecificado. EMFILE: No hay espacio en la tabla de descriptores del proceso para crear una nuevaentradadondealmacenareldescriptordelsocket. ENFILE:Latabladedescriptoresdearchivosdelsistemaestallena. EACCES: No se tienen los permisos suficientes para crear un socket del tipo especificado. ENOBUFS:Nohayrecursossuficientesparaasignarunbufferalsocket.

Verelarchivodecabecera

bind()Lafuncinbind()asociaunnombreaunsocket,esdecir,leasociaunadireccinIPy un puerto. Normalmente se utiliza bind() cuando el ambiente de comunicacin del socketesatravsdeInternetycuando: 1. SedebeasociarunadireccinIPyunpuertoaunservidor,detalmaneraquelos clientes sepan dnde encontrar este servicio. El servidor recibir toda la informacin destinada a esa direccin y ese puerto. Todo los servidores deben realizar esta operacin, ya sean que este configurados para recibir informacin orientadaaconexinono. 2. Un cliente que establezca comunicaciones no orientadas a conexin asociar un nombrealsocketparapoderrecibirlasrespuestasalosdatagramasqueenve. Laestructuradelafuncinbind()es: #include #include intbind(intsockfd,structsockaddr*my_addr,intaddrlen); Dnde: sockfd= /* Es el descriptor del socket que se obtuvo con lallamadaasocket()*/ my_addr= /* Es un apuntador a la estructura genricasockaddr. Se deber rellenar los parmetros de una estructura sockaddr_in y se har un casting a la estructurasockaddr*/ /*Eseltamaodelaestructurasockaddr*/

addrlen=

Paraunautilizacindeundominioparticular,elapuntadormy_addrapuntaaunazona cuya estructura es la de una direccin en ese dominio (sockaddr_un para el dominio AF_UNIXysockaddr_inparaeldominioAF_INET). Lafuncindevuelveunvalorde0sihayunerroryunvalorde1encasocontrario.Los posibleserroressealmacenanenlavariableerrnoypuedenserlossiguientes: EBADF:elsocketsockfdnoesundescriptorvalido. EINVAL:Elsocketsockfdnotieneunnombreasociado. EACCES:Nosetienelosprivilegiossuficientesparaasociarelnombrequehemos indicadoalsocket. ENOTSOCK:sockfdnoesundescriptordelsocket. EADDRNOTAVAIL:Nosepuedeasignarelnombreespecificado. EADDRINUSE:Elnombreespecificadoyaestenuso.

ENOSR:Nohayrecursossuficientes.

*DominioUNIX. En el dominio UNIX, los sockets no se destinan ms que a una comunicacin local. Por tanto,lescorrespondendireccioneslocalesquesonreferenciasUNIXidnticasalasdelos archivos.UnsocketdeldominioUNIX,aparecerdespusdelnombradoenlosresultados producidosporlaordenlsconeltipos.Lasupresindeunareferenciadeestetipo,espor mediodelaordenrmodelaprimitivaunlink. *DominioInternet. a)Preparacindeladireccin. LaconexinaunadireccinInternetdeunsocketdeestedominionecesitalapreparacin deunobjetoquetengalaestructurasockaddr_in.Estosuponeenparticular: el conocimiento de la direccin de la mquina local (obtenida por medio de la primitiva gethostname y la primitiva gethostbyname) o la eleccin del valor INADDR_ANY; laeleccindeunnmerodepuerto. b)Recuperacindeunadireccin. Un proceso puede disponer de un descriptor de un socket conectado o enlazado a una direccin pero sin saber cul es (si la conexin ha sido realizada por otro proceso y el proceso ha heredado el descriptor o si la conexin ha sido realizada sin especificar el nmerodepuerto).Laprimitiva: intgetsockname(sock,p_adr,p_lg) intsock;/*descriptordelsocket*/ structsockaddr*p_adr;/*punteroalazonadedireccin*/ int*p_lg;/*punteroalalongituddeladireccin*/ permite recuperar la direccin relacionada con el socket del descriptor sock. Cuando se llamaaestaprimitiva,eltercerparmetroseutilizacomodatoycomoresultado: en la llamada, *p_lg tiene como valor el tamao de la zona reservada a la direccinp_adrpararecuperarladireccindelsocket; enelretornodelallamada,tienecomovaloreltamaoefectivodeladireccin. Elvalorderetornodelaprimitivaes0o1segnsilallamadahatenidoxitoono.

listen()Estafuncinseutilizaenservidoresquesonconfiguradosparaestablecercomunicacin orientada a conexin (servidores que utilizan sockets de tipo SOCK_STREAM o SOCK_SEQPACKET)paraprepararsepararecibirconexionesdelosclientes. Estafuncinseutilizatrashaberobtenidoeldescriptordelsocketyhaberleasignadoun nombre con bind(). Despus de utilizar esta funcin se debe hacer una llamada a accept()paraaceptarlaconexinrealizadaporuncliente. Ladefinicindeestafuncines: #include intlisten(ints,intmaxNumConex); dnde: s= /*eseldescriptordelsocket*/

maxNumConex= /*Es el mximo nmero de conexiones que el servidor puede tener en espera hasta que hace llamada a accept() para aceptar una de ellas. El mximo nmero de conexiones es 128 y este valor estrepresentadoporlaconstanteSOMAXCONN*/ Sielnmeromximodeconexionesesalcanzadoyotroclienteintentaconectarse,nose dispondr de recursos para almacenar su conexin, por lo que recibir un error de tipo ECONNREFUSED. Silallamadaalisten()terminaconxitoseobtendrunvalorde0,casocontrariose obtendrunvalorde1.Loserroressealmacenanenlavariableerrnoypuedenserlos siguientes: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EOPNOTSUPP:Elsocketshacereferenciaaunsocketquenosoportalaoperacin listen().

accept()Esta primitiva permite aceptar una conexin realizada por un cliente a un servidor orientadoaconexin.Estafuncintomalaprimeraconexinqueseencuentraenlacola deesperademaxNumConexdelaprimitivalisten()ydevuelveundescriptordelsocket quesevaautilizarparadichaconexin.Sinohayningunaconexinenespera,accept() provocaqueelprocesoquelainvocasequedeenesperadeunaconexin. Ladefinicindeestafuncines: #include #include intaccept(ints,structsockaddr*addrCliente,int*addrlen); dnde: s= /*es el descriptor del socket por el cual se aceptanlasconexionesdelosclientes*/

addrCliente= /*Es un apuntador a una estructura spockaddr_in, donde se van a almacenar los datos (direccin, puerto, etc) del cliente remoto que ha iniciado unaconexin*/ addrlen= /*indicaeltamaodelparmetroaddrCliente*/

Silallamadaaaccept()terminaconxitolafuncindevolverunnuevodescriptorde socketquehacereferenciaalsocketqueseutilizarparaenviaryrecibirinformacinde uncliente,casocontrarioserecibirunvalorde1.Loscdigosdeerrorsealmacenanen lavariableerrnoypuedeserlossiguientes: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:elsocketsnoesunsocketsinoaunarchivo. EOPNOTSUPP:elsocketsnoesdeltipoSOCK_STREAM. EFAULT: el argumento addrCliente hace referencia a un zona de memoria dondenosepuedeescribir. EWOULDBLOCK:elsockethasidomarcadocomonobloqueanteynohayninguna peticindeconexinenespera.

connect()Esta primitiva permite a un proceso cliente comenzar el proceso de conexin con un procesoservidor,abreuncircuitovirtualentredossockets,elcualpermiteintercambiode informacinbidireccional. Ladefinicindeestafuncines: #include #include intconnect(ints,structsockaddr*serv_addr,int*addrlen); dnde: s= /*es el descriptor del socket obtenido tras la llamadaalafuncinsocket()*/ /*Es un apuntador a una estructura spockaddr_in, donde se indica la direccin y el puerto del host oservidorquesedesearealizarlaconexin*/ /*indicaeltamaodelparmetroserv_addr*/

serv_addr=

addrlen=

Normalmenteestaprimitivaesutilizadaporunclientequerequierecomunicarseconun servidoratravsdeunprotocoloorientadoaconexin.Enestecasoconnect()realizar unintercambiodemensajeshandshakedeTCPculminandoconelestablecimientodela conexinoconladevolucindeunerror. Silaconexinseestablececonxito,estafuncindevuelveunvalorde0,casocontrario devolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. EFAULT:elargumentoserv_addrhacereferenciaaunzonadememoriadonde nosepuedeescribir. ENOTSOCK:elsocketsnoestasociadoaunsocket. EISCONN:Elsocketyaestconectado. ECONNREFUSED:Elservidorrechazolaconexin. ETIMEDOUT:Seagoteltiempoestablecidopararealizarlaconexin. ENETUNREACH:Nosepuedealcanzarlared. EADDRINUSE:Ladireccinyaestenuso. EINPROGRESS: El socket est marcado como no bloqueante y la conexin no puedeserestablecidainmediatamente.

EALREADY:Elsocketestmarcadocomonobloqueanteyunintentodeconexin anteriorannosehacompletado.

Elusodeconnect()noesexclusivoparaclientesconopcinorientadaaconexin,ya queunclientenoorientadoaconexintambinpodrahacerusodeestafuncin,eneste casonoseintentarealizarunaconexin,sinoqueseutilizaparaalmacenarlosdatosde direccin y puerto del servidor para usarlos como referencia para uso futuro en que el cliente quiera enviar datos a travs del socket identificado por la variable s. De esta maneranosenecesitarespecificarladireccinypuertoencadadatagramaqueseenve almismodestinooservidor. Tambinseutilizaparaforzaraquelos nicosdatagramas queserecibanprovengandelmismoservidor. Otrousoescuandolosclientesnoorientadosaconexinseannotificadossiseenvaun datagrama a una direccin invlida. Esta notificacin se puede obtener a travs de un mensajeICMPdetipodestinoinalcanzable.

close()Esta primitiva permite cerrar un socket. Si un socket est asociado a un protocolo orientado a conexin, es decir, una desconexin ordenada, entonces el sistema debe asegurarse de que todos los datos pendientes de ser enviados o pendientes de confirmacin sean tratados antes de cerrar el socket. Aunque la primitiva socket sea exitosa, el que kernel o S.O. puede seguir trabajando con los datos para asegurar una desconexinfiable. Ladefinicindeestafuncines: #include intconnect(intfd); dnde: fd= /*es el descriptor del socket que se desea cerrar*/

Siladesconexinserealizaconxito,estafuncindevuelveunvalorde0,casocontrario devolverunvalorde1yelerrorsepuededebera: EBADF:elsocketfdnoesundescriptorvalidoabierto.

shutdown()Esta funcin permite cerrar una conexin igual que close() pero permite un mayor control sobre la forma en que se realiza la desconexin en un intercambio de datos bidireccional. Ladefinicindeestafuncines: #include intshutdown(ints,inthow); dnde: s= /*es el descriptor del socket que se desea cerrar*/ /*Es la forma en que se desea realizar la desconexinylosvaloresquepuedetomarson: 0:indicaquenosepodrnrecibirmsdatos porelsocket 1: indica que no se podrn enviar ms datos porelsocket 2:indicaquenosepodrnenviarnirecibir msdatosporelsocket*/

how=

Siladesconexinserealizaconxito,estafuncindevuelveunvalorde0,casocontrario devolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:elsocketsnoestasociadoaunsocket. ENOTCONN:Elsocketsespecificadonoestconectado.

Primitivasdeenvoyrecepcindeinformacin.write()Es una funcin estndar que permite enviar datos por un socket como un flujo de tipo SOCK_STREAM. Ladefinicindeestafuncines: #include ssize_twrite(ints,constvoid*buf,size_tcount); dnde: s= buf= /*eseldescriptordelsocket*/ /*Es un apuntador al buffer donde se encuentran almacenadoslosdatosaenviar*/ /*Eseltamaodelbufferdedatos*/

count=

Silaescrituraserealizaconxito,estafuncindevuelveelnmerodebytesescritos,caso contrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. EINVAL:Elsocketsnopermitelaoperacindeescritura. EFAULT: el buffer buf no se encuentra dentro del espacio de direcciones del proceso. EPIPE:Elotroextremodelaconexinestcerrado,porloquelosdatosescritosno pueden ser ledos al otro extremo. Al intentarse escribir nuevamente el proceso recibirlasealSIGPIPE. EAGAIN: Los datos no pueden ser escritos en este momento y el proceso ha elegidounmododeescrituranobloqueante. EINTR: Antes de que se pueda realizar la escritura de datos, la funcin fue interrumpida. ENOSPC:Nosepuedenalmacenarlosdatos. EIO:ErrordeE/Sdebajonivel.

read()Es una funcin estndar que permite leer un flujo de datos de un socket de tipo SOCK_STREAM. Ladefinicindeestafuncines: #include Ssize_tread(ints,void*buf,size_tcount); dnde: s= buf= /*eseldescriptordelsocket*/ /*Es un apuntador de tipo void al buffer donde se almacenarnlosdatosleidos*/ /*Eseltamaodelosdatosquesevanaleer*/

count=

Si la lectura se realiza con xito, esta funcin devuelve el nmero de bytes ledos, caso contrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalidoonoaceptalaoperacindelectura. EINVAL:Elsocketsnopermitelaoperacindelectura. EINTR: Antes de que se pueda realizar la lectura de datos, la funcin fue interrumpida. EAGAIN: No haba datos disponibles en el pipe y el socket se haba configurado comonobloqueante,porloquesedevuelveesteerrorenlugardequeelproceso sequedebloqueadoenesperadelallegadadedatos. EISDIR:elsocketshacereferenciaaundirectorio. EIO:ErrordeE/Sdebajonivel.

send()PermiteenviardatosporunsocketcomounflujodetipoSOCK_STREAM.Adiferenciade write(),permiteespecificaropcionesdeenvoalossockets. Ladefinicindeestafuncines: #include #include

intsend(ints,constvoid*msg,intlen,unsignedintflags); dnde: s= msg= /*eseldescriptordelsocket*/ /*Es un apuntador a un buffer donde se encuentran almacenadoslosdatosaenviar*/ /*Eseltamaodelbufferdedatos*/ /*Especificaelmododeenvodelosdatosypuede tomarlossiguientesvalores: 0: hace que send() se comporte igual que write(), es decir, no se especifican caractersticas de envoespeciales. MSG_OOB:indicaenvodedatosurgentes. MSG_DONTROUTE: hace que se ignoren los mecanismos deencaminamientoquepuedanestarestablecidosen los protocolos de capas inferiores, enviado directamente los datos a la interfaz de red adecuada*/ Si el envo de datos se realiza con xito, esta funcin devuelve el nmero de bytes escritos,casocontrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EFAULT: el buffer msg no se encuentra dentro del espacio de direcciones del proceso. EMSGSIZE:Eltamaodelmensajeimposibilitaquestepuedaserenviadoenun solo flujo y el socket ha sido configurado para realizar nicamente este tipo de envios. EWOULDBLOCK: El socket ha sido configurado como no bloqueante, pero la funcindeberabloquearse. ENOBUFS: No se ha podido reservar memoria para buffers internos necesarios pararealizarlaoperacin.

len= flags=

recv()Permite la recepcin de datos como un flujo de tipo SOCK_STREAM. A diferencia de read(),permiteespecificaropcionesespecialesqueafectanelmodoenquesereciben losdatosdelsocket. Ladefinicindeestafuncines: #include #include Intrecv(ints,void*buf,intlen,unsignedintflags); dnde: s= buf= /*eseldescriptordelsocket*/ /*Esunapuntadoraunbufferdondesealmacenarn losdatosrecibidos*/ /*Es el tamao del buffer de datos, limitando el nmeromximodebytesaleer*/ /*Especifica el modo de recepcin de los datos y puedetomarlossiguientesvalores: MSG_OOB:indicarecepcindedatosurgentes. MSG_PEEK: permite acceder a los datos recibidos sin eliminarlos del buffer de entrada una vez que la lectura se ha realizado. Una lectura de datos posteriordevolveralosmismodatos*/ MSG_WAITTALL: Hace que la operacin de lectura se bloquee hasta que el buffer de entrada se llene, esdecir,hastaquesehayanledolenbytes. Silalecturadedatosserealizaconxito,estafuncindevuelveelnmerodebytesledos, casocontrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EFAULT: el buffer buf no se encuentra dentro del espacio de direcciones del proceso.

len=

flags=

ENOTCONN: El socket es del tipo SOCK_STREAM, pero an no se ha realizado la conexin(faltaunallamadaaconnect()sielprocesoesunclienteoaccept() siesunservidor). EWOULDBLOCK: El socket ha sido configurado como no bloqueante, pero la operacin de lectura debera bloquearse, ya que no hay datos disponibles. Tambin se puede recibir este mensaje si se ha establecido un tiempo lmite de recepcinystehaexpirado. EINTR:Laoperacindelecturafueinterrumpidaantesdeleerdatos.

sendto()Permite enviar datos por un socket como un flujo de tipo SOCK_STREAM orientado a conexinoSOCK_DGRAMnoorientadoaconexin. Ladefinicindeestafuncines: #include #include intsendto(ints,constvoid*msg,intlen,unsignedintflags, conststructsockaddr*to,inttolen); dnde: s= msg= /*eseldescriptordelsocket*/ /*Es un apuntador a un buffer donde se encuentran almacenadoslosdatosaenviar*/ /*Eseltamaodelbufferdedatos*/ /*Especificaelmododeenvodelosdatosypuede tomarlossiguientesvalores: 0: hace que send() se comporte igual que write(), es decir, no se especifican caractersticas de envoespeciales. MSG_OOB:indicaenvodedatosurgentes. MSG_DONTROUTE: hace que se ignoren los mecanismos deencaminamientoquepuedanestarestablecidosen los protocolos de capas inferiores, enviado directamente los datos a la interfaz de red adecuada*/

len= flags=

to=

/*Es una estructura de datos de tipo sockaddr que es el casting de una estructura sockaddr_in donde se especifican la IP y el puerto del host destino*/ /*Eseltamaodelaestructurasockaddr*/

tolen=

Si el envo de datos se realiza con xito, esta funcin devuelve el nmero de bytes escritos,casocontrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EFAULT: el buffer msg no se encuentra dentro del espacio de direcciones del proceso. EMSGSIZE:Eltamaodelmensajeimposibilitaquestepuedaserenviadoenun solo flujo y el socket ha sido configurado para realizar nicamente este tipo de envios. EWOULDBLOCK: El socket ha sido configurado como no bloqueante, pero la funcindeberabloquearse. ENOBUFS: No se ha podido reservar memoria para buffers internos necesarios pararealizarlaoperacin.

recvfrom()Permite la recepcin de datos de un socket como un flujo de tipo SOCK_STREAM orientadoaconexinoSOCK_DGRAMnoorientadoaconexin. Ladefinicindeestafuncines: #include #include Intrecvfrom(ints,constvoid*buf,intlen,unsignedintflags, structsockaddr*from,intfromlen); dnde: s= buf= /*eseldescriptordelsocket*/ /*Esunapuntadoraunbufferdondesealmacenarn losdatosrecibidos*/

len=

/*Es el tamao del buffer de datos, limitando el nmeromximodebytesaleer*/ /*Especifica el modo de recepcin de los datos y puedetomarlossiguientesvalores: MSG_OOB:indicarecepcindedatosurgentes. MSG_PEEK: permite acceder a los datos recibidos sin eliminarlos del buffer de entrada una vez que la lectura se ha realizado. Una lectura de datos posteriordevolveralosmismodatos*/ MSG_WAITTALL: Hace que la operacin de lectura se bloquee hasta que el buffer de entrada se llene, esdecir,hastaquesehayanledolenbytes.

flags=

from=

/*Es una estructura de datos de tipo sockaddr que es el casting de una estructura sockaddr_in donde se almacenan los datos del host emisor del mensaje, en caso de estar leyendo informacin de un socket no orientado a conexin. Este parmetro puede ser NULL si no interesa obtener dicha informacin o el socket es orientado a conexin, encuyocasoyasabemosculeselotroextremode laconexin*/ /*Eseltamaodelaestructurasockaddr*/

fromlen=

Silalecturadedatosserealizaconxito,estafuncindevuelveelnmerodebytesledos, casocontrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EFAULT: el buffer buf no se encuentra dentro del espacio de direcciones del proceso. ENOTCONN: El socket es del tipo SOCK_STREAM, pero an no se ha realizado la conexin(faltaunallamadaaconnect()sielprocesoesunclienteoaccept() siesunservidor). EWOULDBLOCK: El socket ha sido configurado como no bloqueante, pero la operacin de lectura debera bloquearse, ya que no hay datos disponibles. Tambin se puede recibir este mensaje si se ha establecido un tiempo lmite de recepcinystehaexpirado.

EINTR:Laoperacindelecturafueinterrumpidaantesdeleerdatos.

sendmsg()Permiteenviarvariosmensajesaunmismodestinoconunanicallamadaalsistema,lo cualevitaenviarmuchosmensajesconsendto()aunmismodestinatario. Ladefinicindeestafuncines: #include #include intsendmsg(ints,conststructmsghdr*msg,unsignedintflags); dnde: s= msg= /*eseldescriptordelsocket*/ /*Es un apuntador a una estructura msghdr que contiene la direccin y puerto destino y los mensajesquesequierenenviar*/ /*Especificaelmododeenvodelosdatosypuede tomarlossiguientesvalores: 0: hace que send() se comporte igual que write(), es decir, no se especifican caractersticas de envoespeciales. MSG_OOB:indicaenvodedatosurgentes. MSG_DONTROUTE: hace que se ignoren los mecanismos deencaminamientoquepuedanestarestablecidosen los protocolos de capas inferiores, enviado directamente los datos a la interfaz de red adecuada*/ La definicin de msghdr puede consultarse en los archivos de cabecera yytienelasiguienteestructura: structmsghdr{ void*msg_name; intmsg_namelen; structiovec*msg_iov; size_tmsg_iovlen;

flags=

/*Bloquededatos*/ /*Numerodebloques*/

};

void*msg_control; size_tmsg_controllen; unsignedmsg_flags;

/*Longituddelalistadecmsg*/

Las variables msg_name y msg_namelen hacen referencia al host destino, msg_name puede tener un valor NULL en el caso de que no se requiera especificar la direccin destino. Loscamposmsg_iovymsg_iovlenhacenreferenciaaunatablademensajesquesern enviados. La estructura iovec est definida de la siguiente forma en el archivo structiovec{ void*iov_base; size_tiov_len; }; Dondecadaentradaenelvectordemensajesserdetipoiovec,siendoiov_baseun apuntadoralbufferdondeseencuentraalmacenadounmenajeyiov_leneltamaode dichomensaje. Lasvariablesmsg_controlymsg_controllenhacenreferenciaaposiblesmensajesde control del protocolo usado. El formato de estos mensajes se define en la siguiente estructura: structcmsghdr{ size_tcmsg_len; intcmsg_level; intcmsg_type; u_charcmsg_data[]; }; Elcampopuedetomarlossiguientesvalores: MSG_EOR:Losdatoscompletanunregistro.Normalmenteestaopcinseusacon socketsdetipoSOCK_SEQPACKET. MSG_TRUNC:Indicaquepartedeldatagramasedescartdebidoaquesutamao eramayorqueelbufferdisponibleparasurecepcin. MSG_CTRUNC:Igualqueelcasoanterior,peroparalosmensajesdecontrol. MSG_OOB:Transmisinorecepcindedatosurgentes.

Si el envo de datos se realiza con xito, esta funcin devuelve el nmero de bytes escritos,casocontrariodevolverunvalorde1ylosposibleserroresson:

EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EFAULT: el buffer msg no se encuentra dentro del espacio de direcciones del proceso. EMSGSIZE:Eltamaodelmensajeimposibilitaquestepuedaserenviadoenun solo flujo y el socket ha sido configurado para realizar nicamente este tipo de envios. EWOULDBLOCK: El socket ha sido configurado como no bloqueante, pero la funcindeberabloquearse. ENOBUFS: No se ha podido reservar memoria para buffers internos necesarios pararealizarlaoperacin.

recvmsg()Permiterecibirunconjuntodemensajesdeunsocket. Ladefinicindeestafuncines: #include #include Intrecvmsg(ints,conststructmsghdr*msg,unsignedintflags); dnde: s= msg= /*eseldescriptordelsocket*/ /*Es un apuntador a una estructura msghdr que contiene la direccin y puerto origen y los mensajesquesequierenrecibir*/ /*Especifica el modo de recepcin de los datos y puedetomarlossiguientesvalores: MSG_OOB:indicarecepcindedatosurgentes. MSG_PEEK: permite acceder a los datos recibidos sin eliminarlos del buffer de entrada una vez que la lectura se ha realizado. Una lectura de datos posteriordevolveralosmismodatos*/ MSG_WAITTALL: Hace que la operacin de lectura se bloquee hasta que el buffer de entrada se llene, esdecir,hastaquesehayanledolenbytes.

flags=

Silalecturadedatosserealizaconxito,estafuncindevuelveelnmerodebytesledos, casocontrariodevolverunvalorde1ylosposibleserroresson: EBADF:elsocketsnoesundescriptorvalido. ENOTSOCK:Elsocketsnoesunsocket. EFAULT: el buffer buf no se encuentra dentro del espacio de direcciones del proceso. ENOTCONN: El socket es del tipo SOCK_STREAM, pero an no se ha realizado la conexin(faltaunallamadaaconnect()sielprocesoesunclienteoaccept() siesunservidor). EWOULDBLOCK: El socket ha sido configurado como no bloqueante, pero la operacin de lectura debera bloquearse, ya que no hay datos disponibles. Tambin se puede recibir este mensaje si se ha establecido un tiempo lmite de recepcinystehaexpirado. EINTR:Laoperacindelecturafueinterrumpidaantesdeleerdatos.

Protocolo de control de transmisin (TCPTransmission Control Protocol) Es el protocolo ms confiable y seguro para enviar entre redes. TCP es un protocoloorientadoaconexinquegenerauncircuitovirtualentredosentidadesdered yqueproporcionafiabilidadextremoaextremo.Paragarantizarelbuenfuncionamiento delared,TCPutilizadiferentestcnicasquemaximizanelrendimientodelasconexiones asegurandoquelossegmentosdedatostienenuntamaoptimoylavelocidaddeenvo es la ms indicada para el circuito virtual establecido. TCP utiliza la tcnica de acuse de reciboparagarantizarlallegadadelosdatosalaentidadremota.

ConexionesTCP Las conexiones TCP funcionan de una forma muy parecida a como lo hacen las conexiones telefnicas, es decir, un usuario inicia la comunicacin y sta debe ser aceptadaporelotrousuariodelotroladodelalnea.Enotraspalabras,cuandouncliente decide establecer una comunicacin con un servidor, es necesario que ambos estn de acuerdoenparticipar,delocontrariolacomunicacinnosepodrllevaracabo.

Hilos(Threads)Losprogramassecuencialessontotalmenteordenados.Estosignificaquecuando seejecutaunprogramapodemossaberdeantemanocualvaaserlaprximainstruccin quesevaaejecutar. Enunprogramaconcurrente,utilizandohilos,elordendeejecucinesparcial.Esto significa que no sabemos cul va a ser la prxima instruccin a ejecutar. No est determinado que instruccin de que hilo o proceso en un momento determinado va a ejecutarse.Estasituacinseconoceconelnombredeindeterminismo. Ensistemasoperativos,unhiloosubprocesoesunacaractersticaquepermitea una aplicacin realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecucincompartenunaseriederecursostalescomoelespaciodememoria,losarchivos abiertos,situacindeautenticacin,etc.Estatcnicapermitesimplificareldiseodeuna aplicacinquedebellevaracabodistintasfuncionessimultneamente. Loqueespropiodecadahiloeselcontadordeprograma,lapiladeejecucinyel estadodelaCPU(incluyendoelvalordelosregistros).

Fig.Ejemplodecmounaaplicacinpuedeserdescompuestaentareasqueseejecutan demaneraindependiente

Unhiloesbsicamenteunatareaquepuedeserejecutadaenparalelojuntocon otratarea. Loshilosquecompartenlosmismosrecursosysumadosastos,sonenconjunto conocidoscomoproceso.Elhechodequeloshilosdeunmismoprocesocompartanlos

mismos recursos hace que cualquiera de los hilos pueda modificarlos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese dato modificado inmediatamente. Elprocesosigueenejecucinmientrasalmenosunodesushilosdeejecucinsiga activo. Cuando el proceso finaliza, todos sus hilos de ejecucin tambin han terminado. Asimismoenelmomentoenelquetodoslos hilosdeejecucinfinalizan,elprocesono existemsytodossusrecursossonliberados. Un programa multihilo es aquel que contiene dos o ms partes que se pueden ejecutar de manera simultnea. La ejecucin de un proceso se realiza mediante un hilo (thread)ylaejecucindeunhiloserealizademaneraindependiente.Porlotanto,ala programacinmultihiloseledenominaunaprogramacinmultitarea. Existendostiposdistintosdemultitarea: Multitareabasadaenprocesos:SerefiereaqueenunCPUsepuedanejecutardos omsprogramasalmismotiempo(p.ejem.,eleditordetextos,elmessengeroel navegadorWeb). Multitarea basada en hilos: Se refiere a que un solo programa puede ejecutar mltiples tareas al mismo tiempo, (p.ejem., en el editor de texto; estar editando untextomientrassemandaaimprimirpartedeldocumento).

Por lo tanto, la multitarea basada en procesos acta sobre tareas generales, mientrasquelabasadaenhilossobretareasmsparticulares. Losprocesossontareasmspesadasquerequierenmsrecursosyquenecesitan espaciodedireccionamientopropio.Mientrasquelastareasdeloshilossontareasligeras yaquecompartenelmismoespaciodedireccionamientoyelmismoproceso. La multitarea basadaen hilos permite escribir programas que hacen uso del CPU eficientemente ya que cada hilo pelea o compite por tiempo de CPU para ejecutar su tarea,porlotanto,noexistentiemposmuertosparaelCPU. EjemplosdondeelCPUtienetiemposmuertos: Cuandoseestenviadoinformacinporlared. Cuandoelusuarioesttecleandoinformacinalaaplicacin. Cuandoseestrealizandooperacionesdelectura/escrituraaundispositivofsico.

Un programa normal se ejecuta mediante un hilo por default y es creado por el mtodo main(), puesto que ste es mtodo que controla el inicio y finalizacin del programa.Lossistemasdeunsolohiloutilizanunenfoquellamadobucledesucesoo sondeo, en este modelo, el hilo de control se ejecuta en un ciclo infinito gestionando

unanicacoladeeventosparadecidirculeselsiguienteaprocesar.Puedesucederque laejecucindeunatareadelprogramabloqueeorealicetareasdondenosehagausodel CPU, mientras esta tarea no retorne el control al hilo principal, entonces se estar desperdiciandoelusodelCPU.Laprogramacinmultihiloresuelveesteproblema,incluso unhilopuededetenersesinpararelflujonormaldelprograma.

EstadosdeunhiloLosprincipalesestadosdeloshilosson:Ejecucin,ListoyBloqueado. Cambiodeestados

Creado:Escuandounprocesosecreaunhiloystepasaraalafinaldeloslistos. Bloqueado:Escuandounhilonecesitaesperarporunsuceso,sebloquea (salvandosusregistrosdeusuario,contadordeprogramaypunterosdepila). Ahoraelprocesadorpodrpasaraejecutarotrohiloqueestenlafinaldelos listosmientraselanteriorpermanecebloqueado. Desbloqueado:Cuandoelsucesoporelqueelhiloestabaesperadoysebloque sucede,entonces,lmismopasaalafinaldelosListos. Muerto:Cuandounhilofinalizasutarea.

CreacinymanipulacindehilosenUnixconpthread LalibreradepthreadsesunalibreraquecumplelosestndaresPOSIXyquenos permite trabajar con distintos hilos de ejecucin (threads) al mismo tiempo. Ya que pthreadsesunalibreraPOSIX,sepodrnportarlosprogramashechosconellaacualquier sistema operativo POSIX que soporte threads. Ejemplos de ello son IRIX, los unix'es de BSD,DigitalUnixOSF/1,etc. Paracrearunthreadnosvaldremosdelafuncionpthread_createdelalibreraydela estructuradedatospthread_tqueidentificacadathreaddiferencindolodelosdemsy quecontienetodossusdatos.

Elprototipodelafuncinpthread_teselsiguiente: intpthread_create(pthread_t*thread,pthread_attr_t*attr, (void*)start_routine(void*),void*arg) Donde: thread:Esunavariabledeltipopthread_tquecontendrlosdatosdelthreadyquenos servir para identificar el thread en concreto cuando nos interese hacer llamadas a la libreraparallevaracaboalgunaaccinsobrel. attr:Esunparmetrodeltipopthread_attr_tyquesedebeinicializarpreviamentecon los atributos que queramos que tenga el thread. Entre los atributos hay la prioridad, el quantum, el algoritmo de planificacin que queramos usar, etc. Si pasamos como parmetro aqu NULL, la librera le asignar al thread unos atributos por defecto (RECOMENDADO). start_routine:Aqupondremosladireccindelafuncinquequeremosqueejecuteel thread. La funcin debe devolver un puntero genrico (void *) como resultado, y debe tenercomonicoparmetrootropunterogenrico.Laventajadequeestosdospunteros seangenricosesquepodremosdevolvercualquiercosaquesenosocurramediantelos castingsdetiposnecesarios. Si necesitamos pasar o devolver ms de un parmetro a la vez, se puede crear una estructuraymeteralldentrotodoloquenecesitemos.Luegopasaremosodevolveremos ladireccindeestaestructuracomonicoparmetro.(vercdigodeejemplo) arg: Es un puntero al parmetro que se le pasar a la funcin. Puede ser NULL si no queremospasarlenadaalafuncin. Encasodequetodohayaidobien,lafuncindevuelveun0ounvalordistintode0en caso de que hubo algun error. Una vez hemos llamado a esta funcin, ya tenemos a nuestro(s) thread(s) funcionando, pero ahora tenemos dos opciones: esperar a que terminen los threads, en el caso de que nos interese recoger algun resultado, o simplemente decirle a la librera de pthreads que cuando termine la ejecucin de la funcindelthreadeliminetodossusdatosdesustablasinternas. Para ello, disponemos de dos funciones ms de la librera: pthread_join y pthread_detach. intpthread_join(pthread_tth,void**thread_return) Estafuncinsuspendeelthreadllamantehastaquenoterminesuejecucinelthread indicadoporth.Adems,unavezsteltimotermina,poneenthread_returnelresultado devueltoporelthreadqueseestabaejecutando. th:Eselidentificadordelthreadquequeremosesperar,yeselmismoqueobtuvimosal crearloconpthread_create. thread_return:Esunpunteroapunteroqueapunta(valgalaredundancia)alresultado devuelto por el thread que estamos esperando cuando termin su ejecucin. Si este

parmetro es NULL, le estamos indicando a la librera que no nos importa el resultado. Devuelve0encasodetodocorrecto,ovalordiferentede0sihuboalgnerror. intpthread_detach(pthread_tth) Esta funcin le indica a la librera que no queremos que nos guarde el resultado de la ejecucin del thread indicado por th. Por defecto la librera guarda el resultado de ejecucindetodoslosthreadshastaquenosotroshacemosunpthread_joinpararecoger elresultado. Esporesoquesinonosinteresaelresultadodelosthreadstenemosqueindicarlocon estafuncin.Asunavezqueelthreadhayaterminadolalibreraeliminarlosdatosdel threaddesustablasinternasytendremosmsespaciodisponibleparacrearotrosthreads (IMPORTANTE) th:Eselidentificadordelthread Devuelve0encasodequetodohayaidobienodiferentede0sihuboerror. Hastaahorahemosestadohablandodedevolvervalorescuandounthreadfinaliza,pero annohemosdichocomosehace.Puesbien,paraellotenemoslafuncinpthread_exit voidpthread_exit(void*retval) Estafuncinterminalaejecucindelthreadquelallama. retval:Esunpunterogenricoalosdatosquequeremosdevolvercomoresultado.Estos datos sern recogidos ms tarde cuando alguien haga un pthread_join con nuestro identificadordethread.Nodevuelveningnvalor. Con todo lo que hemos visto hasta ahora ya estamos preparados para hacer nuestro primer programa con pthreads. El programa de ejemplo crear MAX_THREADS threads queejecutarnlafuncinfuncion_thr. Esta funcin sacar un mensaje por pantalla del tipo "hola, soy el thread nmero x", donde x ser un nmero diferente para cada thread. Para pasar esos parmetros a la funcin usaremos un struct del C, donde meteremos la cadena que debe imprimr cada threadmssuidentificador.(Lacadenalapodramoshabermetidodirectamentedentro delafuncin,peroasveremoscmosepasamsdeunparmetroalthread) Una vez termina su ejecucin, el thread devolver como resultado su identificador (codificado en un entero), que ser imprimido por pantalla por el thread padre que esperarquetodoslosthreadsterminen.