ProsisSep

Clasificado en Apuntes de Lengua y literatura de Bachiller.

Escrito el 09 de Septiembre de 2009 en esEspañol y con un tamaño de 4.999 bytes.

ServiTxat:#include <stdio.h>#include <string.h>#in clude <se maphore.h>#include<sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#inclu de<pthread.h>#define NUMPORT 5000#define SE RVADR "127.0.0.1"#define MAXLENGTH 50#define MAXLINEA 200struct cliente{int id;int nsfd;sem_t nue vo,leido;char bufferEntrada [MAXLENGTH];char buff erSalida [MAXLENGTH];pthread_t hiloenv,hilorec;} listaClientes[2];int CrearSockect (){int sfd;sfd = soc ket (AF_IN ET,SOCK_STREAM,0);if (sfd == -1) printf ("\n Error al crear el socket");return sfd;}int Asignar Direccion (int sfd,struct sockaddr_in* dirServ){int err;dirServ->sin_family = AF_INET;dirServ->sin_p ort = htons(NUMPORT);dirServ->sin_addr.s_addr = htonl(INADDR_ANY);err = bind (sfd,(void *)dirSe rv,sizeof(*dirServ));if (err==-1){printf ("\n Error al asociar la direcci o n");return -1;}return 0;}int Crear ColaPeticiones(int sfd,int valor){ int err;err = listen (sfd, valor);if (err==-1){printf ("\n Error al crear la cola de peticiones");return -1;}return 0;}int Aceptar Peticion(int sfd,struct sockaddr_in * dirClient){ uns igned int dirClientLen;int nsfd;dirClientLen = sizeof (*dirClient);printf("Esperando cliente\n");nsfd = acc ept (sfd,(void *) dirClient,&dirClientLen);if (nsfd==-1)printf ("\n Error al crear la cola de peticiones");ret urn nsfd;}int recibirMensaje (int nsfd,char * mensaj e){char Buffer[MAXLENGTH];int length;length = MAX LENGTH;length = read (nsfd,Buffer,length);if (length == -1){printf("\nError al leer");return -1;}strncpy(me nsaje,Buffer,length);return 0;}int enviarMensaje(int nsfd,char * msgenv){int length;length= write (nsfd, msgenv,strlen(msgenv)+1);if (length==-1){printf("\nError al escribir");return -1;}return 0;}void * reci bir (void *num){int id = *((int*)num);int ns = listaClie ntes[id].nsfd;char msgLeido[MAXLINEA];do{printf ("hilo para recibir del cliente %d",id);recibirMensaje (ns,listaClientes[id].bufferEntrada);strcpy(msgLei do, listaClientes[id].bufferEntrada);


printf("%d\tleido %s\n",id,msgLeido);sem_wait(&(lis taClientes[1-id].leido) );strcpy(listaClientes[1-id].bu fferSalida,msgLeido); sem_post (&(listaClientes[1-id].nuevo));}while (strcmp(msgLeido,"quit"));return NULL;}void * enviar (void * num){int id = *((int*)num );int ns = listaClientes[id].nsfd;char msgEnviado[MA XLINEA];do{printf ("Hilo para enviar del cliente %d",id);sem_wait (&(listaClientes[id].n uevo)); strcpy(msgEnvi ado,listaClientes[id].bufferSalida);enviar Mensaj e (ns,msgEnviado);strcpy(listaClientes[id]. bufferSal ida,"");printf("%d\tenviado: %s\n",id,msg Enviado); sem_post(&(listaClientes[id].leido));}whi le (strcmp(msgEnviado,"quit")); ret urn NULL;}int main (){struct sockaddr_in dirServ, dirClient;int sfd;int numCliente=0;int err;char msgInicio[MAXLIN EA];if ((sfd = CrearSockect())==-1) return -1;if((err= AsignarDireccion(sfd,&dirServ))== -1) return -1;if((err=CrearColaPeticiones(sfd,5))==-1) return -1; do {if ((listaClientes[numCliente].nsfd = AceptarPet icion(sfd,&dirClient))!=-1)numCliente++; }while(nu mCliente!=2);numCliente = 0;do {sem_init (&(listaCli ente s [numCliente].nuevo),0,0);sem_init (&(listaClie ntes[numCliente].leido),0,1);numCliente++;}while(num Cliente!=2);numCliente = 0;do{listaClientes[nu mCliente].id = numCliente;pthread_create(&(lista Cliente[numClie nte].hiloenv) ,NULL,envi ar, (void*)&(listaClientes[numCliente].id));pthread_cre ate(&(listaClientes[numCliente].hilorec),NULL,reci bir,(void*)&(listaClientes[numCliente].id));strcpy(msgInicio, "ya puedes iniciar la conexion");enviar Mensaje (listaClientes[numCliente].nsfd,msgInicio); printf("atendiendo cliente %d\n",numCliente);num Cliente++; }while (numCliente!=2);for (numCliente=0;numCliente<2;numCliente++){printf("esperando fin cliente %d\n",numCliente);pthread_join(listaClie ntes[numCliente].hiloenv,NULL);pthread_join(lista Clientes[numCliente].hilorec,NULL);}for(numClien te=0;numCliente<2;numCliente++){sem_destroy(&(listaClientes[numCliente].nuevo));sem_destroy(&(listaClientes[numCliente].leido));}return 0;}


Tags:prosissep,cliente,error,crear,quot;\n,return
Este documento se ha visitado 9 veces y le gusta a 1 personas
© Wikiteka, 2010
Chuletas  |  Apuntes