Socket en C++
Socket en C++
debido a la complejidad que ejerce establecer comunicacin entre dos aplicaciones utilizando la interfaz "SOCKETS" decid programar una librera que facilitar mucho el trabajo de comunicarse por sockets. bien, primero deben abrir un block de notas y copiar el cdigo luego guardar el archivo con extensin .h yo lo llame Socket.h Caracteristicas de la librera: -Cuenta con dos clases, una llamada "servidor" y la otra "cliente" -cuenta con multiples constructores los cuales asignan por defecto un puerto y una direccin a la cual conectarse -Cuenta con destructores. -Coneccin y resultados en muy pocos pasos. - NO permite coneccin multihilo, es decir, es solo para un cliente y un servidor (ya se viene con multihilo). Aqu va el cdigo CDIGO / ******************************************************************************** ****************************** *Titulo: <Socket.h> *Autor: Zzombi *Version: 1.0 * *Descripcin: Librera para hacer un cliente y/o servidor (sin posibilidad de multihilo) y permite el envio . * de mensajes. ******************************************************************************** *******************************/ #include <winsock2.h> #include <winsock.h> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") //********************************COMIENZA LA CLASE "SERVER"****************************************************** class server{ private: struct sockaddr_in local; protected: //datos que sern heredables ya que se ocupan los mismos en la clase cliente int puerto; SOCKET sock;
int len; WSADATA wsa; char Buffer[1024]; public: //CONSTRUCTORES server(); server(int port); //DESTRUCTOR ~server(){}; //MTODOS int iniciarSock(int valor); //inicia la DLL encargada de los sockets int crearSock(); //crea un dominio de comunicacin pero no establece comunicacin void puertoSock(int port); //asigna el puerto de comunicacin int preparaSock(); int escuchar(); //se pone a la espera de alguna llamada de un cliente int aceptarConeccion(); //acepta la llamada del cliente int recibir(); //recibe la llamada y la presenta en pantalla int probarConeccion(); //permite comprobar si la conexin sigue buena }; int server::iniciarSock(int valor){ int resul; resul=WSAStartup(MAKEWORD(2,valor),&wsa); //el primer parmetro es la versin del socket if(resul!=0) return 1; return 0; } int server::crearSock(){ sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (sock==-1) return 1; //si la conexin del socket falla se retorna 1 return 0; //si est bien se retorna 0 } void server::puertoSock(int port){ puerto=port; } int server::preparaSock(){ int resul; local.sin_family = AF_INET; local.sin_addr.s_addr = INADDR_ANY; local.sin_port = htons(9999); resul=bind(sock, (SOCKADDR*) &local, sizeof(local)); if( resul != 0) return 1; return 0; }
int server::escuchar(){ int resul=listen(sock,1); if(resul != 0) return 1; return 0; } int server::aceptarConeccion(){ len=sizeof(struct sockaddr); sock=accept(sock,(sockaddr*)&local,&len); if(sock==INVALID_SOCKET) return 1; return 0; } int server::probarConeccion(){ return len; } int server::recibir(){ len=recv(sock,Buffer,1023,0); if(len==SOCKET_ERROR) return 1; Buffer[len]=0; cout<<"El cliente dice: "<<Buffer<<endl; return 0; } //se empiezan a codear los constructores server::server(){ iniciarSock(0); puertoSock(9999); } server::server(int port){ iniciarSock(0); puertoSock(port); } // ******************************************************************************** *****************************
class cliente: public server{ private: struct hostent *host; struct sockaddr_in direc; int conex; public: //CONSTRUCTORES cliente(int port,char dominio[]); cliente(); cliente(int port); cliente(char dominio[]); //DESTRUCTOR ~cliente(){}; //MTODOS void dominioSock(char dir[]); int conectarSock(); void enviarDatos(char cad[]); }; void cliente::dominioSock(char dir[]){ host=(struct hostent *)gethostbyname(dir); } int cliente::conectarSock(){ direc.sin_family=AF_INET; direc.sin_port=htons(puerto); direc.sin_addr = *((struct in_addr *)host->h_addr); memset(direc.sin_zero,0,8); conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr)); if (conex==-1) return 1; //si la conexion falla se retorna 1 return 0; //si est bien se retorna 0 } void cliente::enviarDatos(char cad[]){ strcpy(Buffer,cad); len=send(sock,Buffer,strlen(Buffer),0); //enviar el texto que se ha introducido } //comienza el codeo de los constructores cliente::cliente(int port,char dominio[]){ puertoSock(port); iniciarSock(2); dominioSock(dominio); } cliente::cliente(){ puertoSock(9999);
iniciarSock(2); dominioSock("localhost"); } cliente::cliente(int port){ puertoSock(port); iniciarSock(2); dominioSock("localhost"); } cliente::cliente(char dominio[]){ puertoSock(9999); iniciarSock(2); dominioSock(dominio); } // ******************************************************************************** *********************************
Como hacerla Funcionar? Cdigo de el cliente: (la librera debes guardarla en el mismo lugar donde vas a generar el ejecutable o en la carpeta INCLUDE de tu compilador) CDIGO #include "Socket.h" int main(int argc, char* argv[]) { char mensaje[1000]; //aqui guardaremos el mensaje que enviaremos al servidor //de definira el puerto 9999 y tu propia maquina osea "localhost" POR DEFECTO //gracias al contructor de la clase cliente //para definir tu propio puerto y otra direccin IP utiliza el otro constructor as: //cliente maquina(8080,"201.172.0.1"); cliente maquina; //objeto de la clase cliente
//en crearSock definimos la versin del socket as como la versin de IP (IPV4) maquina.crearSock(); maquina.conectarSock(); //conectamos //mientras la coneccin siga establecida, se podr enviar mensajes
while(maquina.probarConeccion() != -1){ cin>>mensaje; maquina.enviarDatos(mensaje);} return 0; } CODIGO DEL SERVIDOR: CDIGO #include "Socket.h" int main(int argc, char* argv[]) { server servidor; servidor.crearSock(); servidor.preparaSock(); //se establece la conexin servidor.escuchar(); //se espera a que el cliente haga un llamado servidor.aceptarConeccion(); //se acepta el llamado del cliente //mientras la coneccin sea exitosa se recibiran los mensajes while(servidor.probarConeccion() != 0) servidor.recibir(); return 0; } TANTO PARA CODIGO EL CLIENTE COMO PARA EL SERVIDOR SE UTILIZAN CONSTRUCTORES PARA ASIGNAR UN PUERTO Y UNA DIRECCION POR DEFECTO REVISEN LOS COMENTARIOS QUE PUSE EN EL CDIGO TANTO DEL CLIENTE COMO DEL SERVIDOR saludos.
http://www.chilecomparte.cl/index.php?showtopic=875628