embedded - read() not working when called from a pthread C -
embedded - read() not working when called from a pthread C -
i writing c server goal of using pthreads handle client connections, works fine until introduce pthreads. fire client off on pthread , created , ran fine; however, no longer 'read()' client's file descriptor.
i have been trying figure out 2 weeks now. have included code snippets of both server code (including , excluding pthreads.) , client handler code.
here main server loop (pthreaded):
/*sets , runs server. (max 10 clients)*/ void publicserver(void) { //server locals int serversocket_fd; int clientsocket_fd; socklen_t serverlength; socklen_t clientlength; struct sockaddr_in serveraddress; struct sockaddr_in clientaddress; //threading locals pthread_t threadpool[20]; //pool of threads, used in fifo fashion. int threadpointer = 0; //points location of next available thread. //clear old sockets puts("unlinking server socket"); unlink("server_socket"); //setup server socket printf("setting server socket properties..\n"); serversocket_fd = socket(af_inet, sock_stream, 0); serveraddress.sin_family = af_inet; serveraddress.sin_addr.s_addr = htonl(inaddr_any); serveraddress.sin_port = htons(5000); serverlength = sizeof(serveraddress); //bind socket printf("binding socket\n"); bind(serversocket_fd, (struct sockaddr*)&serveraddress, serverlength); //create listener listen(serversocket_fd, 20); //main server loop printf("entering main loop\n"); while (1) { clientlength = sizeof(clientaddress); //accept connection printf("blocking connection\n"); clientsocket_fd = accept(serversocket_fd, (struct sockaddr*)&clientaddress, &clientlength); //handle client pthread_create(&threadpool[0], null, clienthandler, clientsocket_fd); //increment thread pointer threadpointer++; if (threadpointer == 20) { threadpointer = 0; } //end client close(clientsocket_fd); } }
here server code without pthreads (works fine.):
/*sets , runs server. (max 10 clients)*/ void publicserver(void) { //server locals int serversocket_fd; int clientsocket_fd; socklen_t serverlength; socklen_t clientlength; struct sockaddr_in serveraddress; struct sockaddr_in clientaddress; //clear old sockets puts("unlinking server socket"); unlink("server_socket"); //setup server socket printf("setting server socket properties..\n"); serversocket_fd = socket(af_inet, sock_stream, 0); serveraddress.sin_family = af_inet; serveraddress.sin_addr.s_addr = htonl(inaddr_any); serveraddress.sin_port = htons(5000); serverlength = sizeof(serveraddress); //bind socket printf("binding socket\n"); bind(serversocket_fd, (struct sockaddr*)&serveraddress, serverlength); //create listener listen(serversocket_fd, 20); //main server loop printf("entering main loop\n"); while (1) { clientlength = sizeof(clientaddress); //accept connection printf("blocking connection\n"); clientsocket_fd = accept(serversocket_fd, (struct sockaddr*)&clientaddress, &clientlength); //handle client clienthandler(clientsocket_fd); //end client close(clientsocket_fd); } }
here client handler code:
/* * handles client's request. * <int : client_fd> client's file descriptor. */ void *clienthandler(int client_fd) { char request = ' '; puts("waiting request"); read(client_fd, &request, 1); //determine user if (request == '1') //output current temp , pressure level { outputcurrenttemperaturepressure(client_fd); } else if (request == '2') //begin regular sampling of temp , pressure level { startsampling(); } else if (request == '3') //stop regular sampling of temp , pressure level { stopsampling(); } else if (request == '4') //clear eeprom { eraseeeprom(); } else if (request == '5') //retrieve stored temperature , pressure level values { outputsavedtemppressvalues(client_fd); } else if (request == '6') //retrieve number of temperature , pressure level values { outputlastntemppressvalues(client_fd); } else if (request == '7') //output current noise level { outputcurrentnoiselevel(client_fd); } close(client_fd); pthread_exit(1); }
the issue line 6 in clienthandler method when effort read client. when ran on pthread reads 0 time. however, when ran without pthreads reads right value. hope can help out puzzling me.
thanks in advance, andy
as far see pthread entry point must have void * argument. way defined clienthandler seems wrong. read this: http://timmurphy.org/2010/05/04/pthreads-in-c-a-minimal-working-example/ .
c embedded pthreads client server
Comments
Post a Comment