ClientChat

Clasificado en Apuntes de Otras materias de Otros cursos.

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

ClientChat :#include<stdio.h>#include<string.h>#in clude<sys/socket.h>#include<pthread.h>#include<stdlib.h>#include<netinet/in.h>#include<arpa/inet .h>#include<unistd.h>#define NUMPORT 5000#de fine SERVADR "127.0.0.1"#define MAXLENGTH 500#define MAXLINEA 200int enviarMensajeServi dor( int nsfd,char * msgenv){int length;length= write (nsfd,msgenv,strlen(msgenv)+1);if (length==-1){pr intf("\nError al escribir");return -1;}return 0;}void * recibirMensajeServidor (void* fd){int nsfd = *((int*)fd);char Buffer[MAXLENGTH];char *mensaje;int len gth;d o{ length = MAXLENGTH;length = read (nsfd, Buffer,length);if (length==-1){printf("\nError al leer"); return NULL;}mensaje = (char *) malloc(length); strncpy(mensaje,Buffer,length);printf ("\nrecibido: %s\n",mensaje);free(mensaje);}while (strcmp(mens aje,"quit")!=0);return NULL;}int CrearSockect (){ int sfd; sfd = socket (AF_INET,SOCK_STREAM,0);if (sfd == -1) printf ("\n Error al crear el socket");retu rn sfd;}int CrearConexion (int sfd,struct sockaddr_ in * dirServ){int err;dirServ->sin_family = AF_INET; dirServ->sin_port = htons(NUMPORT);dirServ->sin_addr.s_addr = htonl(INADDR_ANY);err = con nect (sfd,(void *)dirServ,sizeof(*dirServ));if (err==-1){printf ("\n Error al crear la conexion");return -1;}return 0;}int main (){struct sockaddr_in dirServ;pth read_t hiloreceptor;int sfd;int err;char mensaje [MAX LINEA];if ((sfd = CrearSockect())==-1) return -1;if ((err= CrearConexion(sfd,&dirServ)) == -1) return -1;pthread_create (&hiloreceptor,NULL,recibirMen sajeServidor,&sfd);do{printf("mensaje a enviar> ");
gets(mensaje);enviarMensajeServidor (sfd,mensa je);}while (strcmp(mensaje,"quit"));close(sfd);retu rn 0;} P
RODU-CONSUM(cond):#include<stdio.h>#include<pthre ad.h>#include<unistd.h>void* funcionProductora(void* );void*funcionConsumido ra(void*);#define MAX_BUFFER 5#define N_PROD UCTORES 3#define N_CONSUMIDORES 3; type def struct cola{int cabeza;int final;int llena;int vacia; char buffer[MAX _BUFFER];pthread_mutex_t mtx; pthread_cond_t condProductores;pthread_cond_t condConsumid ores;}COLA,*PCOLA;}

typedef struct paramProd{ int salto;int tope;int segEs pera;} PARAM_PROD,*PPARAM_PROD;COLA cola ={0,0,0,1};int finalizar=0;int main(){pthread_t idProd uctores[N_PRODUCTORES];pthread_t idConsum idores[N_CONSUMIDORES];char str[30];int i;PARA M_PROD paramsProd[N_PRODUCTORES]={{10, 100,1},{17,100,2},{23,100,3}};pthread_mutex_init(&cola.mtx,NULL);pthread_cond_init(&cola.condPr oductores,NULL);pthread_cond_init(&cola.cond Consumidores,NULL);for(i=0;i<N_PRODUCTOR ES;i++)pthread_create(&idProductores[i],NULL,fun cionProductora,(void*)&paramsProd[i]);for(i=0;i<N_CONSUMIDORES;i++)pthread_create(&idCon sumidores[i],NULL,funcionConsumidora,(void*)(i+1));for(i=0;i<N_PRODUCTORES;i++)pthread_join(idProductores[i],NULL);pthread_mutex_lock(&co la.mtx);finalizar=1;pthread_cond_broadcast(&cola. condConsumidores);pthread_mutex_unlock(&co la.mtx);for(i=0;i<N_CONSUMIDORES;i++)pthread_ join(idConsumidores[i],NULL);pthread_mutex_des troy(&cola.mtx);pthread_cond_destroy(&cola.co ndProductores);pthread_cond_destroy(&cola.co ndConsumidores);printf("pulse \"Return\" para fina lizar\n");fgets(str,sizeof(str),stdin); return 0;}void* fu ncionProductora( void* arg){int i=0,antesVacia;PA RAM_PROD params=*((PPARAM_PROD)arg);whi le(i<params.tope){sleep(params.segEspera);pthr ead_mutex_lock(&cola.mtx);while(cola.llena) pthre ad_cond_wait(&cola.condProductores,&cola.mtx); antesVacia=cola.vacia;cola.buffer[cola.cabeza]=i;
cola.cabeza=(cola.cabeza+1)%MAX_BUFFER; i+=params.salto;cola.vacia=0;cola.llena=(cola.final ==cola.cabeza);if(antesVacia) pthread_cond_bro adcast(&cola.condConsumidores);pthread_mutex _unlock(&cola.mtx);}return NULL;}
void* funcionCo nsumidora( void* arg){int n,acabar=0,antesLlena, numTabs=(int)arg;do{pthread_mutex_lock(&cola. mtx);while(cola.vacia && ! finalizar) pthread_cond_ wait(&cola.condConsumidores,&cola.mtx);if(!cola. vacia){antesLlena=cola.llena;n=cola.buffer[cola.fin al];cola.final=(cola.final+1)%MAX_BUFFER;printf("%*d\n",numTabs*4,n);cola.vacia=(cola.cabeza==co la.final);cola.llena=0;if(antesLlena) pthread_cond_ broadcast(&cola.condProductores);sleep(1);}else acabar=finalizar;pthread_mutex_unlock(&cola.mtx );}while(!acabar);return NULL;
Tags:clientchat,return,int,mtx);while(cola,buffer[cola,length
Este documento se ha visitado 10 veces y le gusta a 1 personas
© Wikiteka, 2010
Chuletas  |  Apuntes