Implementaci n Cliente Servidor

12
48 48 A T REVISTA VÍNCULOS VOL. 8 y NÚMERO 2 y JULIO - DICIEMBRE DE 2011 Implementación cliente servidor mediante sockets Client-server implementation using sockets Héctor Julio Fúquene Ardila* Fecha de recepción: septiembre 30 de 2011 Fecha de aceptación: noviembre 4 de 2011 Resumen Este artículo pretende hacer visibles los requerimientos tanto físicos, lógicos y funcionales necesarios para establecer una comunicación entre dos computadores utilizando sockets; se plantean los diferentes protocolos mediante los cuales se puede realizar su implemen- tación; además, se presentan las principales características téc- nicas a tener en cuenta y se realiza la implementación mediante el uso del lenguaje de programación como C++. Palabra clave Programa cliente, programa servidor, comunicaciones, puerto lógico, protocolo, dirección IP. Abstract This article aims to make visible the requirements of both physical, logi- cal and functional requirements for communication between two com- puters using sockets, raised different protocols by which implementa- tion can be done, also presents the main technical features to consider and implementation is done using the programming language C + +. Keywords Client (customer) program, server program, communications, logic port, protocol, IP address. * Ingeniero de sistemas, Magister en teleinformática, miembro del grupo de investigación IAFT, docente de palnta de la Universidad Distrital Francisco José de Caldas. [email protected]

description

Este artículo pretende hacer visibles los requerimientos tanto físicos, lógicos yfuncionales necesarios para establecer una comunicación entredos computadores utilizando sockets; se plantean los diferentesprotocolos mediante los cuales se puede realizar su implementación;además, se presentan las principales características técnicasa tener en cuenta y se realiza la implementación medianteel uso del lenguaje de programación como C++.Palabra clavePrograma cliente, programa servidor, comunicaciones, puertológico, protocolo, dirección IP.

Transcript of Implementaci n Cliente Servidor

4848A TREVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011I m p l e m e n t a c i n c l i e n t e s e r v i d o r m e d i a n t e s o c k e t sImplementacin cliente servidor mediante sockets Client-server implementation using socketsHctor Julio Fquene Ardila*Fecha de recepcin: septiembre 30 de 2011Fecha de aceptacin: noviembre 4 de 2011ResumenEste artculo pretende hacer visibles los requerimientos tanto fsicos, lgicos y funcionales necesarios para establecer una comunicacin entre dos computadores utilizando sockets; se plantean los diferentes protocolos mediante los cuales se puede realizar su implemen-tacin; adems, se presentan las principales caractersticas tc-nicas a tener en cuenta y se realiza la implementacin mediante el uso del lenguaje de programacin como C++.Palabra claveProgramacliente,programaservidor,comunicaciones,puerto lgico, protocolo, direccin IP.AbstractThis article aims to make visible the requirements of both physical, logi-cal and functional requirements for communication between two com-puters using sockets, raised different protocols by which implementa-tion can be done, also presents the main technical features to consider and implementation is done using the programming language C + +.KeywordsClient(customer)program,serverprogram,communications,logic port, protocol, IP address.*Ingeniero de sistemas, Magister en teleinformtica, miembro del grupo de investigacin IAFT, docente de palnta de la Universidad Distrital Francisco Jos de Caldas. [email protected] 49REVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011V N C U L O SJULI O- DI CI EMBREDE2011V OL U ME N 8 N ME R O2HCTOR JULIO FQUENE ARDILAIntroduccinLacomunicacinentreentidadesabstrac-tas (PCs) se logra utilizando diferentes tc-nicas,unadeellasesutilizandosockets, queconsisteencongurarunaredcliente servidorparaestablecerelujodeinfor-macin entre transmisor y receptor.Esposibleutilizarunprotocoloorientado aconexincomoTCP(TransferControl Protocol)ounonoorientadoaconexin comoUDP(UserDatagramProtocol),la diferencia entre los dos es la abilidad que sepuedegarantizarconunprotocoloque garantice la conexin con el extremo recep-tor, es decir que sea orientado a conexin.Paraquedosaplicacionespuedaninter-cambiar informacin entre s se necesita:Unprotocolodecomunicacinco-mn a nivel de red y a nivel de trans-porte.Unadireccindelprotocolodered queidentiqueacadaunodelos computadores.Un nmero de puerto que identique la aplicacin dentro del computador.Lossocketseutilizanparapoderenviar rdenes a un servidor que est atendiendo nuestras peticiones. Por lo tanto, un socket quedara denido por una direccin IP (La delequipoqueactacomoservidor),un protocoloyunnmerodepuerto(Eluti-lizado para acceder a un servicio determi-nado).Asuvez,lossocketsestnbasadosenel protocolodecomunicacionesutilizadoen Internet: TCP (Transmisin Control Proto-col).La funcin del protocolo TCP es, ni ms ni menos que la de traer y llevar informacin desde un servidor a un cliente y viceversa utilizando los diferentes protocolos utiliza-dos por cada servicio.Qu son los sockets?Podemos encontrar diferentes deniciones, algunas de ellas son: Lossocketssonunmtododecomunica-cinentreunprogramadeclienteyuno deservidoratravsdeunared.Unsoc-ket se dene como el extremo de una co-nexin.Unsocket,esunmtodoparalacomuni-cacin entre un programa del cliente y un programa del servidor en una red. Un soc-ketsedenecomoelpuntonalenuna conexin. Los sockets se crean y se utilizan con un sistema de peticiones o de llamadas de funcin a veces llamados interfaz de pro-gramacindeaplicacindesockets(API, Application Programming Interface).Unsocketestambinunadireccinde Internet,combinandounadireccinIP(la direccin numrica nica de cuatro octetos queidenticaauncomputadorparticular en Internet) y un nmero de puerto (el n-meroqueidenticaunaaplicacindeIn-ternet particular)Unsocketesunpuntonaldeunenlace de comunicacin de dos vas entre dos pro-gramas que se ejecutan a travs de la red.Cmo se establecela comunicacin con sockets?Elclienteyelservidordebenponersede acuerdo sobre el protocolo que utilizarn.Hay dos tipos de socket:Orientado a conexinEstablece un camino virtual entre servidor ycliente,able,sinprdidasdeinforma-cinniduplicados,lainformacinllega en el mismo orden que se enva. El cliente abre una sesin en el servidor y este guar-da un estado del cliente. 5050A TREVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011I m p l e m e n t a c i n c l i e n t e s e r v i d o r m e d i a n t e s o c k e t sOrientado a no conexinEnvo de datagramas de tamao jo.No es able, puede haber prdidas de informacin y duplicados, y la informacin puede llegar en distinto orden del que se enva. No se guar-da ningn estado del cliente en el servidor, por ello, es ms tolerante a fallos del sistema.Lossocketsnosonmsquepuntosomeca-nismos de comunicacin entre procesos que permiten que un proceso hable (emita o re-cibainformacin)conotroprocesoincluso estandoestosprocesosendistintasmqui-nas. Esta caracterstica de interconectividad entre mquinas hace que el concepto de soc-ket nos sirva de gran utilidad. Un socket es al sistema de comunicacin entre computadores, lo que un buzn o un telfono es al sistema de comunicacin entre personas: un punto de comunicacin entre dos agentes (procesos o personas respectivamente) por el cual se puede emitir o recibir informacin. La arquitectura cliente-servidorEs un modelo de aplicacin distribuida en el quelastareasserepartenentrelosprovee-dores de recursos o servicios, llamados ser-vidores, y los demandantes, llamados clien-tes.Unprogramaclienterealizapeticiones aotroprograma,elservidor,queledares-puesta.Estaideatambinsepuedeaplicar a programas que se ejecutan sobre una sola mquina,aunqueesmsventajosaenun sistemaoperativomultiusuariodistribuido a travs de una red de computadores.En esta arquitectura la capacidad de proceso estrepartidaentrelosclientesylosservi-dores. La separacin entre cliente y servidor esunaseparacindetipolgico,dondeel servidornoseejecutanecesariamenteso-breunasolamquinaniesnecesariamente unsloprograma.Lostiposespeccosde servidores incluyen los servidores webs, los servidores de archivo, los servidores del co-rreo, entre otros. Mientras que sus propsi-tos varan de unos servicios a otros, la arqui-tectura bsica seguir siendo la misma.La comunicacin entre procesos a travs de socketssebasaenlalosofacliente-servi-dor:unprocesoenestacomunicacinac-tuar de proceso servidor creando un socket cuyo nombre conocer el proceso cliente, el cualpodrhablarconelprocesoservi-dor a travs de la conexin con dicho socket nombrado. El proceso crea un socket sin nombre cuyo valordevueltaesundescriptorsobreel que se leer o escribir, permitindose una comunicacinbidireccional,caracterstica propia de los sockets. El mecanismo de co-municacin va sockets tiene los siguientes pasos:Elprocesoservidorcreaunsocketcon nombre y espera la conexin. Elprocesoclientecreaunsocketsin nombre.Elprocesoclienterealizaunapeticin de conexin al socket servidor. El cliente realiza la conexin a travs de susocketmientraselprocesoservidor mantieneelsocketservidororiginal con nombre. Es muy comn en este tipo de comunicacin lanzar un proceso hijo, una vez realizada la conexin,queseocupedelintercambiode informacin con el proceso cliente mientras elprocesopadreservidorsigueaceptando conexiones. Para eliminar esta caracterstica secerrareldescriptordelsocketservidor con nombre en cuanto realice una conexin con un proceso socket cliente. El ServidorApartirdeestepuntocomenzamosconlo queeslaprogramacinenC++delossoc-kets. Se debe poseer conocimientos de C++, deestaformasermsfcilelatenderel procedimiento a seguir.Con C++ en Unix/Linux, los pasos que debe seguir un programa servidor son los siguien-tes:51 51REVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011V N C U L O SJULI O- DI CI EMBREDE2011V OL U ME N 8 N ME R O2HCTOR JULIO FQUENE ARDILARealizar la apertura de un socket, median-te la funcin socket(). Esta funcin devuel-veundescriptordearchivonormal,como puededevolverloopen().Lafuncinsoc-ket()nohaceabsolutamentenada,salvo devolvernosyprepararundescriptorde cheroqueelsistemaposteriormenteaso-ciar a una conexin en red.Avisar al sistema operativo de que hemos abiertounsocketyqueremosqueasocie nuestroprogramaadichosocket.Secon-siguemediantelafuncinbind().Elsiste-matodavanoatenderalasconexiones de clientes, simplemente anota que cuando empiece a hacerlo, tendr que avisarnos.Es enestallamadacuandosedebeindicarel nmerodeservicioalquesequiereaten-der.Avisaralsistemadequecomienceaaten-der dicha conexin de red. Se consigue me-diantelafuncinlisten().Apartirdeeste momentoelsistemaoperativoanotarla conexindecualquierclienteparapasr-nosla cuando se lo pidamos. Si llegan clien-tes ms rpido de lo que somos capaces de atenderlos,elsistemaoperativohaceuna cola con ellos y nos los ir pasando segn vayamos pidindolo.Pediryaceptarlasconexionesdeclientes al sistema operativo. Para ello hacemos una llamada a la funcin accept(). Esta funcin le indica al sistema operativo que nos d al siguiente cliente de la cola. Si no hay clien-tessequedarbloqueadahastaquealgn cliente se conecte.Escribir y recibir datos del cliente, por me-diodelasfuncioneswrite()yread(),que sonexactamentelasmismasqueusamos paraescribiroleerdeunarchivo.Obvia-mente,tantoclientecomoservidordeben saberqudatosesperanrecibir,qudatos deben enviar y en qu formato. Cierre de la comunicacin y del socket, por mediodelafuncinclose(),queeslamis-ma que sirve para cerrar un archivo.El ClienteLospasosquedebeseguirunprograma cliente son los siguientes:Realizar la apertura de un socket, como el servidor, por medio de la funcin socket()Solicitar conexin con el servidor por me-diodelafuncinconnect().Dichafuncin quedarbloqueadahastaqueelservidor aceptenuestraconexinobiensinohay servidorenelsitioindicado,saldrdando unerror.Enestallamadasedebefacilitar la direccin IP del servidor y el nmero de servicio que se desea.Escribiryrecibirdatosdelservidorpor medio de las funciones write() y read().Cerrarlacomunicacinpormediodeclo-se().Comosepuedeapreciar,elprocedimiento enelclienteesmuchomssencilloqueel servidor,mssinembargo,sedebecomo mnimo garantizar en los dos extremos, un pasodeestablecimientodelacomunica-cin,unodetransferenciadeinformacin y uno mediante el cual se libera la comuni-cacin.Tipos de socketsTodo socket viene denido por dos caracte-rsticas fundamentales: El tipo del socket y el dominio del socket.Eltipodelsocket,queindicalanaturale-za del mismo, el tipo de comunicacin que puede generarse entre los sockets.El dominio del socket especica el conjunto desocketsquepuedenestablecerunaco-municacin con el mismo.Lossocketsdenenlaspropiedadesdelas comunicacionesenlasquesevenenvuel-tos, esto es, el tipo de comunicacin que se puededarentreclienteyservidor.Estas pueden ser:5252A TREVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011I m p l e m e n t a c i n c l i e n t e s e r v i d o r m e d i a n t e s o c k e t sFiabilidad de transmisin.Mantenimiento del orden de los datos.No duplicacin de los datos.El Modo Conectado en la comunicacin.Envo de mensajes urgentes. Y cmo Logran hablarlos computadores.Acontinuacinsedescribedetalladamen-tecmoseestablecelacomunicacinentre dosprocesosresidentesenunmismoPCo en mquinas diferentes. Se describe las fun-ciones utilizadas, haciendo nfasis en los pa-rmetrosutilizadosyenelordenlgicode invocacin. Inicialmente, se hace la descrip-cindelprocesorealizadoenelservidory posteriormente lo que ocurre en el cliente.A continuacin se presenta el cdigo en C++ para Windows, utilizando ambiente grco. EnWindowsesindispensableutilizarlali-brera winsock2.h y utilizar el software Dev C++ generando un proyecto.Servidor.//nombrarestecdigoconelnombreser-ver.cpp#include #include #include #include #include #include #dene DEFAULT_BUFLEN 512#dene DEFAULT_PORT 9999#dene SERVER_ICON 100#dene CM_INICIAR 101#dene CM_SALIR 102#dene CM_CERRARCONEXION 103#dene CM_ENVIARDATA 104LRESULTCALLBACKWindowProcedure (HWND, UINT, WPARAM, LPARAM);char szClassName[ ] = Server;void InsertarMenu(HWND);char enviardata(HWND, char*);WSADATA wsa;SOCKET sock;struct sockaddr_in local;int len=0;char Buffer[500000];intWINAPIWinMain(HINSTANCEhThi-sInstance, HINSTANCE hPrevInstance,LPSTR lpszArgument, int nFun sterStil){HWND hwnd; MSG messages;WNDCLASSEX wincl;wincl.hInstance = hThisInstance;wincl.lpszClassName = szClassName;wincl.lpfnWndProc = WindowProce- dure;wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX);wincl.hIcon = LoadIcon (NULL, IDI_AP-PLICATION);wincl.hIconSm = LoadIcon (NULL, IDI_ APPLICATION);wincl.hCursor = LoadCursor (NULL,IDC_ARROW);wincl.lpszMenuName = NULL;wincl.cbClsExtra = 0; wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH) CO- LOR_BACKGROUND;if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0, szClassName, Server,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USE DEFAULT, 640, 480, HWND_DES- KTOP,NULL, hThisInstance, NULL );53 53REVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011V N C U L O SJULI O- DI CI EMBREDE2011V OL U ME N 8 N ME R O2HCTOR JULIO FQUENE ARDILAInsertarMenu(hwnd); ShowWindow (hwnd, nFunsterStil);while(GetMessage(&messages,NULL,0, 0)) {TranslateMessage(&messages);DispatchMessage(&messages); } return messages.wParam;}struct thread1{HWND hwnd1;HWND hwnd2;HWND hwnd3;};thread1 obj1;UINT ThreadProc1(LPVOID lpvoid);UINT ThreadProc1(LPVOID lpvoid){thread1 *temp = (thread1*)lpvoid;HWND hwnd= temp->hwnd1;HWNDhwndRECIBIDO=temp->hwnd2;HWND hwndSTATUS = temp->hwnd3;HDC hdc= GetDC(hwnd); WSAStartup(MAKEWORD(2,0),&wsa);sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(9999);if(bind(sock,(SOCKADDR*)&local, sizeof(local))==-1) {SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) ERROR ); } if (listen(sock,1)==-1) {SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) ERROR ); } else {SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) INICIADO ); } len=sizeof(struct sockaddr);sock=accept(sock,(sockaddr*)&local,&len);SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) CONECTADO ); while (len!=0) { len=recv(sock,Buffer,499999,0); if (len>0) {Buffer[len]=0; SendMessage(hwndRECIBIDO, WM_SET-TEXT, 0, (long int) Buffer ); } Sleep(1); }}LRESULTCALLBACKWindowProcedure (HWNDhwnd,UINTmessage,WPARAM wParam, LPARAM lParam){static HINSTANCE hInstance;char textoAENVIAR[500000];HANDLE hThrd1,hThrd2; switch (message) { case WM_CREATE:staticHWNDhwndENVIARDATA= CreateWindow ( button, Enviar,WS_CHILD|WS_VISIBLE|BS_CENTER,520,395,100,30,hwnd,(HMENU)CM_ENVIARDATA, hInstance, NULL );staticHWND hwndRECIBIDO=CreateWindowEx ( WS_EX_CLIENTEDGE, EDIT,,WS_CHILD | WS_VSCROLL | ES_MUL-5454A TREVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011I m p l e m e n t a c i n c l i e n t e s e r v i d o r m e d i a n t e s o c k e t sTILINE|WS_VISIBLE|WS_BORDER| WS_TABSTOP,10, 10, 612, 275, hwnd,NULL, hInstance, NULL );staticHWND hwndENVIAR=CreateWindowEx ( WS_EX_CLIENTEDGE,EDIT,,WS_CHILD | WS_VSCROLL | ES_MUL-TILINE|WS_VISIBLE|WS_BORDER| WS_TABSTOP,10, 300, 497, 125, hwnd,NULL, hInstance, NULL );staticHWND hwndSTATUS=CreateWindowEx ( WS_EX_CLIENTEDGE,EDIT,STAND-BY,WS_CHILD|WS_VISIBLE|WS_BOR-DER | WS_TABSTOP,520, 325, 100, 25, hwnd,NULL, hInstance, NULL ); break;case WM_COMMAND: switch(LOWORD(wParam)) { case CM_INICIAR:// Run the rst Threadobj1.hwnd1 = hwnd;obj1.hwnd2 = hwndRECIBIDO;obj1.hwnd3 = hwndSTATUS;hThrd1=CreateThread(NULL,0,(LP-THREAD_START_ROUTINE)Threa-dProc1, (LPVOID)&obj1,CREATE_SUSPENDED, NULL);ResumeThread(hThrd1); SetThreadPriority(hThrd1,THREAD_PRI-ORITY_HIGHEST);break; case CM_SALIR: closesocket(sock); WSACleanup(); PostQuitMessage(0); break;case CM_CERRARCONEXION: closesocket(sock); WSACleanup(); break;case CM_ENVIARDATA: GetWindowText(hwndENVIAR, textoA-ENVIAR, 500000);enviardata(hwndENVIAR,textoAEN-VIAR); break; } break;case WM_DESTROY: closesocket(sock); WSACleanup(); PostQuitMessage (0); break;default:returnDefWindowProc(hwnd,message, wParam, lParam); } return 0;}charenviardata(HWNDhwndENVIAR, char *entrada){send(sock,entrada,strlen(entrada),0);SendMessage(hwndENVIAR,WM_SET-TEXT, 0, (long int) );}void InsertarMenu(HWND hwnd){ HMENU hMenu1, hMenu2;hMenu1 = CreateMenu();hMenu2 = CreateMenu();AppendMenu(hMenu2,MF_STRING,CM_INICIAR, &Iniciar Server);AppendMenu(hMenu2,MF_STRING,CM_CERRARCONEXION,&CerrarConex-ion);AppendMenu(hMenu2,MF_SEPARATOR, 0, NULL);55 55REVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011V N C U L O SJULI O- DI CI EMBREDE2011V OL U ME N 8 N ME R O2HCTOR JULIO FQUENE ARDILAAppendMenu(hMenu2,MF_STRING,CM_SALIR, &Salir);AppendMenu(hMenu1, MF_STRING | MF_POPUP, (UINT)hMenu2, &Menu);SetMenu (hwnd, hMenu1);}Como se estn ejecutando las dos aplicacio-nes en la misma mquina (cliente y servidor) sedebeiniciardeformaindependiente.En la grca anterior aparece la interfaz inicial del servidor. Elprogramaclientesepresenta a continuacin://nombrar este cdigo con el nombre clien-te.cpp#include #include #include #include #include #include #dene DEFAULT_BUFLEN 512#dene DEFAULT_PORT 9999#dene CLIENT_ICON 100#dene CM_CONECTAR 101#dene CM_SALIR 102#dene CM_CERRARCONEXION 103#dene CM_ENVIARDATA 104LRESULTCALLBACKWindowProcedure (HWND, UINT, WPARAM, LPARAM);char szClassName[ ] = Client;void InsertarMenu(HWND);char enviardata(HWND, char*);WSADATA wsa;SOCKET sock;int len;char Buffer[500000];struct hostent *host;struct sockaddr_in direc;int conex;intWINAPIWinMain(HINSTANCEhThi-sInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil){ HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLI-CATION);wincl.hIconSm=LoadIcon(NULL,IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground=(HBRUSH)CO-LOR_BACKGROUND; if (!RegisterClassEx (&wincl))return 0; hwnd = CreateWindowEx (0, szClassName, Client,5656A TREVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011I m p l e m e n t a c i n c l i e n t e s e r v i d o r m e d i a n t e s o c k e t s WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, HWND_DESKTOP, LoadMenu(hThisInstance, Menu), hThisInstance, NULL ); InsertarMenu(hwnd); ShowWindow (hwnd, nFunsterStil);while(GetMessage(&messages,NULL,0, 0)) {TranslateMessage(&messages);DispatchMessage(&messages); } return messages.wParam;}struct thread1{HWND hwnd1;HWND hwnd2;HWND hwnd3;HWND hwnd4;};thread1 obj1;UINT ThreadProc1(LPVOID lpvoid);UINT ThreadProc1(LPVOID lpvoid){thread1 *temp = (thread1*)lpvoid;HWND hwnd= temp->hwnd1;HWND hwndSTATUS = temp->hwnd2;HWND hwndIP = temp->hwnd3;HWNDhwndRECIBIDO=temp->hwnd4;HDC hdc= GetDC(hwnd); WSAStartup(MAKEWORD(2,2),&wsa);//resuelveelnombrededominiolocal-host, esto se resolver a 127.0.0.1 //host=gethostbyname(127.0.0.1); char ip[30]; GetWindowText(hwndIP, ip, 30); host=gethostbyname(ip); //se crea el socketsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (sock==-1) {SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) ERROR );; }//Sedeneladireccinaconectarque hemos recibido desde el gethostbyname //y se decide que el puerto al que deber conectar es el 9999 con el protocolo ipv4 direc.sin_family=AF_INET; direc.sin_port=htons(9999);direc.sin_addr=*((structin_addr*)host->h_addr); memset(direc.sin_zero,0,8); //Intentamos establecer la conexinconex=connect(sock,(sockaddr*)&direc, sizeof(sockaddr)); if (conex==-1)//si no se ha podido conec-tar porque no se ha encontrado el host o no//est el puerto abierto {SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) ERROR ); } else {SendMessage(hwndSTATUS,WM_SET-TEXT, 0, (long int) CONECTADO );}len=sizeof(struct sockaddr);while (len!=0) //mientras estemos conec-tados con el otro pc {len=recv(sock,Buffer,499999,0);//recibi-mos los datos if (len>0)//si seguimos conectados { Buffer[len]=0; //le ponemos el nal de ca-dena SendMessage(hwndRECIBIDO, WM_SET-TEXT, 0, (long int) Buffer );57 57REVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011V N C U L O SJULI O- DI CI EMBREDE2011V OL U ME N 8 N ME R O2HCTOR JULIO FQUENE ARDILA } Sleep(1); }}LRESULTCALLBACKWindowProcedure (HWNDhwnd,UINTmessage,WPARAM wParam, LPARAM lParam){static HINSTANCE hInstance;char textoAENVIAR[500000];HANDLE hThrd1,hThrd2; switch (message) { case WM_CREATE:staticHWNDhwndENVIARDATA= CreateWindow ( button, Enviar,WS_CHILD|WS_VISIBLE|BS_CENTER,520,395,100,30,hwnd,(HMENU)CM_ENVIARDATA, hInstance, NULL );staticHWND hwndRECIBIDO=CreateWindowEx ( WS_EX_CLIENTEDGE, EDIT,,WS_CHILD|WS_VSCROLL|ES_MUL-TILINE|WS_VISIBLE|WS_BORDER| WS_TABSTOP,10, 10, 612, 275, hwnd,NULL, hInstance, NULL );staticHWND hwndENVIAR=CreateWindowEx ( WS_EX_CLIENTEDGE, EDIT,,WS_CHILD | WS_VSCROLL | ES_MUL-TILINE|WS_VISIBLE|WS_BORDER| WS_TABSTOP,10, 300, 497, 125, hwnd,NULL, hInstance, NULL ); static HWND hwndIP=CreateWindowEx ( WS_EX_CLIENTEDGE,EDIT,127.0.0.1,WS_CHILD|WS_VISIBLE|WS_BOR-DER | WS_TABSTOP,520, 355, 100, 25, hwnd,NULL, hInstance, NULL );staticHWND hwndSTATUS=CreateWindowEx ( WS_EX_CLIENTEDGE,EDIT,STAND-BY,WS_CHILD|WS_VISIBLE|WS_BOR-DER | WS_TABSTOP,520, 325, 100, 25, hwnd,NULL, hInstance, NULL ); break;case WM_COMMAND: switch(LOWORD(wParam)) { case CM_CONECTAR:obj1.hwnd1 = hwnd;obj1.hwnd2 = hwndSTATUS;obj1.hwnd3 = hwndIP;obj1.hwnd4 = hwndRECIBIDO; hThrd1 = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) ThreadProc1, (LPVOID)&obj1, // param to thread func CREATE_SUSPENDED, // creation ag NULL);// ResumeThread(hThrd1); SetThreadPriority(hThrd1,THREAD_PRI-ORITY_HIGHEST);break; case CM_SALIR: closesocket(sock); WSACleanup(); PostQuitMessage(0); // enva un mensaje WM_QUIT a la cola de mensajes break; case CM_CERRARCONEXION: closesocket(sock); WSACleanup(); break;5858A TREVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011I m p l e m e n t a c i n c l i e n t e s e r v i d o r m e d i a n t e s o c k e t s case CM_ENVIARDATA: GetWindowText(hwndENVIAR, textoA-ENVIAR, 500000);enviardata(hwndENVIAR,textoAEN-VIAR);//SendMessage(hwndENVIAR,WM_SETTEXT, 0, (long int) textoAENVIAR ); break; } break;case WM_DESTROY: PostQuitMessage (0); break;default: returnDefWindowProc(hwnd,message, wParam, lParam); } return 0;}charenviardata(HWNDhwndENVIAR, char *entrada) //FUNCION DE ENVIAR{send(sock,entrada,strlen(entrada),0);SendMessage(hwndENVIAR,WM_SET-TEXT, 0, (long int) );}void InsertarMenu(HWND hwnd){ HMENU hMenu1, hMenu2;hMenu1 = CreateMenu();hMenu2 = CreateMenu();AppendMenu(hMenu2,MF_STRING,CM_CONECTAR, &Conectar);AppendMenu(hMenu2,MF_STRING,CM_CERRARCONEXION,&CerrarConex-ion);AppendMenu(hMenu2,MF_SEPARATOR, 0, NULL);AppendMenu(hMenu2,MF_STRING,CM_SALIR, &Salir);AppendMenu(hMenu1, MF_STRING | MF_POPUP, (UINT)hMenu2, &Menu);SetMenu (hwnd, hMenu1);}Enlagrcasiguientevisualizamoselpri-merpantallazoquepresentaelprograma cliente. El programa se puede correr en una sola mquina con la direccin 127.0.0.1 o en una diferente para lo cual se debe introducir la direccin IP correspondiente al servidor. En este tipo de aplicaciones, podemos direc-cionar datos en ambas direcciones, es decir el cliente y el servidor pueden hacer las veces detransmisorydereceptor.Enlapantalla anterior visualizamos el mensaje recibido, lo que transmiti la aplicacin servidor.Conclusiones.Laimplementacinvaadependersiempre del sistema operativo que se est utilizando. Si el sistema es Linux se debe utilizar libre-ras especcas, con las cuales realizar el pro-ceso.Funcionalmenteelprocedimientono sufre cambios signicativos.Lamayoradelenguajesdeprogramacin permiten hacer este tipo de implementacio-nes,puesposeenlaslibrerasyfunciones con las cuales trabajar.En la actualidad existe una gran variedad de aplicaciones que utilizan este tipo de arqui-tectura(cliente/servidor)parainteractuar; pues se logran optimizar los recursos y dis-tribuir los procesos.59 59REVISTA VNCULOS VOL. 8NMERO 2JULIO - DICIEMBRE DE 2011V N C U L O SJULI O- DI CI EMBREDE2011V OL U ME N 8 N ME R O2HCTOR JULIO FQUENE ARDILAEl proceso realizado en el cliente lo podemos considerarmssencilloqueelrealizadoen elservidorsegnseesquematizaenelsi-guiente diagrama. El programar la WIN-API de Windows nosfacilitaenormementeeltrabajo; nos da la posibilidad del uso de inter-facesestndarypermiteunamayor interaccin entre el usuario y la aplica-cin; identicando plenamente los dos extremos de la transmisin, el cliente y el servidor.Trabajos futurosElprogramasepuedemejorarpara que sea un poco ms didctico para el usuario nal, de tal forma que se pue-da identicar el tipo de transmisin, el modo de transmisin y las velocidades de transmisin utilizadas.Sepuedemejorarelprogramapara quepermitalatransmisindearchi-vos,puesactualmentesetransmiten los caracteres de forma individual.Referencias BibliogrcasDEITEL, Harvey M. Cmo programar en C/C++ y Java. Mxico: Prentice Hall. 2004DONOHOOMichaelJ.,CALVERT,LKen-neth. TCP/IP sockets in C bundle. Edito-rial PrenticeHall. 2009DONAHOO, Michael. TCP/IP Sockets in C: Practical guide for programmers. Estados Unidos: Morgan Kaufmann. 2009FOROUNZANBehrouz A.Transmisin de DatosyRedesdeComunicaciones.Mc-GrawHill. 2009KENDALL,Kenneth.AnlisisyDiseode Sistemas. Mxico: Prentice Hall. 2005MRQUEZGarcaManuel,Unix,Progra-macin avanzada, editorial Ra-ma. 2005RUMBAUGHJames,Modeladoydiseo orientadoaobjetos.MetodologaOMT, Editorial Prentice Hall. 2006STALLING, William. Comunicaciones y Re-des de Computadores. Editorial Prentice-Hall. 2000Fuentes Electrnicashttp://www.winprog.org/tutorial/es/in-dex.htmlhttp://es.tldp.org/Universitarios/semina-rio-2-sockets.htmlhttp://www.chuidiang.com/varios/Li-bros/libros.phphttp://www.arrakis.es/~dmrq/beej/in-dex.htmlhttp://www.mitecnologico.com/Main/ComunicacionClienteServidorSocketsServidor socketbindlistenacceptTrx/RxcloseCliente socketconnectTrx/Rxclose