diff --git a/network.c b/network.c index 3776084e..701b407d 100644 --- a/network.c +++ b/network.c @@ -361,7 +361,7 @@ CreateSocketAdress( iRet = send(self->sockid,buffer,lLen,0); if(iRet != lLen) { - printf("Incomplete send: %d to %d\n ",iRet,lLen); + printf("Incomplete send: %d to %d\n",iRet,lLen); if(iRet < 0) { printf("System error: %s\n",strerror(errno)); @@ -389,7 +389,8 @@ CreateSocketAdress( if(timeout > 0) { /* setup for select first */ - tmo.tv_usec = timeout; + tmo.tv_usec = timeout % 1000000; + tmo.tv_sec = timeout / 1000000; FD_ZERO(&lMask); FD_SET(self->sockid,&lMask); if((self->sockid >= FD_SETSIZE) || (self->sockid < 0) ) /* invalid descriptor */ @@ -424,7 +425,7 @@ CreateSocketAdress( } /*---------------------------------------------------------------------*/ int NETAvailable(mkChannel *self, int timeout) - { + { fd_set lMask; struct timeval tmo ={0,1}; int iRet; @@ -435,7 +436,8 @@ CreateSocketAdress( } /* setup for select */ - tmo.tv_usec = timeout; + tmo.tv_usec = timeout % 1000000; + tmo.tv_sec = timeout / 1000000; FD_ZERO(&lMask); FD_SET(self->sockid,&lMask); if((self->sockid >= FD_SETSIZE) || (self->sockid < 0) ) @@ -457,27 +459,11 @@ CreateSocketAdress( return 0; } } -/*------------------------------------------------------------------------*/ -static int findTerm(char *buffer, char *term) -{ - int i, j; - for(i = 0; i < strlen(buffer); i++) - { - for(j = 0; j < strlen(term); j++) - { - if(buffer[i] == term[j]) - { - return i; - } - } - } - return -1; -} /*-------------------------------------------------------------------------*/ int NETReadTillTermNew(mkChannel *self, int timeout, char *pTerm, char *pBuffer, int iBufLen) { - time_t maxTime; + time_t maxTime, now; int bufPtr = 0, status, i, length; char c; @@ -489,28 +475,19 @@ int NETReadTillTermNew(mkChannel *self, int timeout, maxTime = time(NULL) + (time_t)ceil((double)timeout/1000); length = strlen(pTerm); memset(pBuffer,0,iBufLen); - while(time(NULL) < maxTime) + + status = NETAvailable(self,timeout*1000); /* first time: full timeout */ + if(status <= 0) /* return on error or on timeout */ + { + return status; + } + while (status > 0) { - /* - is data available - */ - status = NETAvailable(self,5); - if(status < 0) - { - return status; - } - if(status == 0) - { - continue; - } status = recv(self->sockid,&c,1,0); if(status < 0) { return status; } - /* - printf("Read char %c\n",c); - */ for(i = 0; i < length; i++) { if(c == pTerm[i]) @@ -518,13 +495,29 @@ int NETReadTillTermNew(mkChannel *self, int timeout, return 1; } } - if(iBufLen - bufPtr > 0) + if(c != 0) /* skip null characters */ { + if(bufPtr >= iBufLen-1) + { + return -1; /* overflow */ + } pBuffer[bufPtr] = c; bufPtr++; } - } - return 0; /* timeout */ + /* + wait for more data + */ + status = NETAvailable(self,1); /* minimal timeout */ + while (status == 0) + { + if(time(NULL) > maxTime) + { + return 0; /* timeout */ + } + status = NETAvailable(self,100000); /* 0.1 s timeout */ + }; + }; + return status; } /*-------------------------------------------------------------------------- This old version may be removed in some stage. It has two problems: