Trådet server store problemer
Hej Eksperter.Vi har lavet en trådet webserver server til et skoleprojekt, men der er noget helt galt. Det er som om at der accepteres flere connections til clienten. Men at det sidste request er toms, det får vores webserver til at sende en bad request tilbage. Vi har med livehttpheaders set at der ikke sendes mere en et request fra clienten. så det giver ingen menning.
Her vores listener
void Listner::startListen(int _port){
pthread_t dummy_thr;
int srv_socket;
int accepted_socket;
size_t size;
struct sockaddr_in port_addr, accept_addr;
int set_opt = 1;
fd_set read_set;
int ready_fd;
/* set up the socket on the server port */
port_addr.sin_family = AF_INET;
port_addr.sin_addr.s_addr = htonl( INADDR_ANY );
port_addr.sin_port = htons( _port );
srv_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt( srv_socket, SOL_SOCKET, SO_REUSEADDR,
(char*)&set_opt, sizeof( set_opt ) );
bind( srv_socket, (struct sockaddr*)&port_addr, sizeof(port_addr));
for(;;) {
/* wait for the client to try to connect */
listen( srv_socket, 5 );
FD_ZERO(&read_set);
FD_SET( srv_socket, &read_set );
do {
ready_fd = select(srv_socket+1, &read_set, NULL, NULL, NULL);
}
while (ready_fd <= 0 || !FD_ISSET(srv_socket, &read_set) );
/* a client has connected. Accept their connection and create a
* thread to serve the client
*/
size = sizeof( accept_addr );
accepted_socket = accept(srv_socket, (struct sockaddr*)&accept_addr,&size);
pthread_create(&dummy_thr, NULL, serveClient, (void*)accepted_socket);
}
}
//For hver accepted connection kaldes: i en ny tråd
void* Listner::serveClient( void* socket )
{
cout << "INDE I SERVECLIENT:"<<int(socket)<<":\n" << flush;
INetSocket *newSocket = new INetSocket;
newSocket->sock = (int)socket;
ServeClient* client = new ServeClient;
client->setINetSocket(newSocket);
client->startServe();
close( (int)socket );
}
// Vi kan se at den går in i denne funktion 2 gange på et request..client->startServe(); læser bare på request og åbner en fil og sender den tilbage med en httpheader. Virker fint.