select() always returns 1; TCP connected socket troubles in c++ -
i'm doing c++ project requires server create new thread handle connections each time accept() returns new socket descriptor. using select decide when connection attempt has taken place when client has sent data on newly created client socket (the 1 accept creates). 2 functions , 2 selects - 1 polling socket dedicated listening connections, 1 polling socket created when new connection successful.
the behavior of first case expect - fd_isset returns true id of listening socket when connection requested, , false until next connection attempt. second case not work, though code same different fd_set , socket objects. i'm wondering if stems tcp socket? these sockets return true when polled select due streamy nature?
//working snippet struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 500000; fd_set readfds; fd_zero(&readfds); fd_set(sid,&readfds); //start server loop for(;;){ //check if listening socket has client requrests, timeout @ 500 ms int numsockets = select(sid+1,&readfds,null,null,&tv); if(numsockets == -1){ if(errno == 4){ printf("sigint recieved in select\n"); fd_zero(&readfds); myhandler(sigint); }else{ perror("server select"); exit(1); } } //check if listening socket ready read after select returns if(fd_isset(sid, &readfds)){ int newsocketfd = accept(sid, (struct sockaddr*)&client_addr, &addrsize); if(newsocketfd == -1){ if(errno == 4){ printf("sigint recieved in accept\n"); myhandler(sigint); }else{ perror("server accept"); exit(1); } }else{ s->forkthreadforclient(newsocketfd); } } //non working snippet //setup clients socket select functionality struct timeval ctv; ctv.tv_sec = 0; ctv.tv_usec = 500000; fd_set creadfds; fd_zero(&creadfds); fd_set(csid,&creadfds); for(;;){ //check if listening socket has client requrests, timeout @ 500 ms int numsockets = select(csid+1,&creadfds,null,null,&ctv); if(numsockets == -1){ if(errno == 4){ printf("sigint recieved in client select\n"); fd_zero(&creadfds); myhandler(sigint); }else{ perror("server select"); exit(1); } }else{ printf("select returned %i\n",numsockets); } if(fd_isset(csid,&creadfds)){ //read header unsigned char header[11]; for(int i=0;i<11;i++){ if(recv(csid, rubyte, 1, 0) != 0){ printf("received %x client\n",*rubyte); header[i] = *rubyte; } }
any appreciated.
thanks responses, don't believe has todo timeout value being inside loop. tested , tv being reset , fd_set being zeroed every time server loops, select still returns 1 immediately. feel there's problem how select treating tcp socket. time set selects highest socket id encompass tcp socket, returns socket set. also, client not send anything, connects.
one thing must reset value of tv
desired timeout every time before call select()
. select()
function changes values in tv
indicate how time left in timeout, after returning function. if fail this, select()
calls end using timeout of zero, not efficient.
some other operating systems implement select()
differently, in such way don't change value of tv
. linux change it, must reset it.
Comments
Post a Comment