Corrected test version of NETReadTillTermNew M.Z.

This commit is contained in:
cvs
2004-08-09 09:03:33 +00:00
parent fe7413471a
commit d2661c83ed

View File

@ -361,7 +361,7 @@ CreateSocketAdress(
iRet = send(self->sockid,buffer,lLen,0); iRet = send(self->sockid,buffer,lLen,0);
if(iRet != lLen) if(iRet != lLen)
{ {
printf("Incomplete send: %d to %d\n ",iRet,lLen); printf("Incomplete send: %d to %d\n",iRet,lLen);
if(iRet < 0) if(iRet < 0)
{ {
printf("System error: %s\n",strerror(errno)); printf("System error: %s\n",strerror(errno));
@ -389,7 +389,8 @@ CreateSocketAdress(
if(timeout > 0) if(timeout > 0)
{ {
/* setup for select first */ /* setup for select first */
tmo.tv_usec = timeout; tmo.tv_usec = timeout % 1000000;
tmo.tv_sec = timeout / 1000000;
FD_ZERO(&lMask); FD_ZERO(&lMask);
FD_SET(self->sockid,&lMask); FD_SET(self->sockid,&lMask);
if((self->sockid >= FD_SETSIZE) || (self->sockid < 0) ) /* invalid descriptor */ if((self->sockid >= FD_SETSIZE) || (self->sockid < 0) ) /* invalid descriptor */
@ -424,7 +425,7 @@ CreateSocketAdress(
} }
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
int NETAvailable(mkChannel *self, int timeout) int NETAvailable(mkChannel *self, int timeout)
{ {
fd_set lMask; fd_set lMask;
struct timeval tmo ={0,1}; struct timeval tmo ={0,1};
int iRet; int iRet;
@ -435,7 +436,8 @@ CreateSocketAdress(
} }
/* setup for select */ /* setup for select */
tmo.tv_usec = timeout; tmo.tv_usec = timeout % 1000000;
tmo.tv_sec = timeout / 1000000;
FD_ZERO(&lMask); FD_ZERO(&lMask);
FD_SET(self->sockid,&lMask); FD_SET(self->sockid,&lMask);
if((self->sockid >= FD_SETSIZE) || (self->sockid < 0) ) if((self->sockid >= FD_SETSIZE) || (self->sockid < 0) )
@ -457,27 +459,11 @@ CreateSocketAdress(
return 0; 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, int NETReadTillTermNew(mkChannel *self, int timeout,
char *pTerm, char *pBuffer, int iBufLen) char *pTerm, char *pBuffer, int iBufLen)
{ {
time_t maxTime; time_t maxTime, now;
int bufPtr = 0, status, i, length; int bufPtr = 0, status, i, length;
char c; char c;
@ -489,28 +475,19 @@ int NETReadTillTermNew(mkChannel *self, int timeout,
maxTime = time(NULL) + (time_t)ceil((double)timeout/1000); maxTime = time(NULL) + (time_t)ceil((double)timeout/1000);
length = strlen(pTerm); length = strlen(pTerm);
memset(pBuffer,0,iBufLen); 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); status = recv(self->sockid,&c,1,0);
if(status < 0) if(status < 0)
{ {
return status; return status;
} }
/*
printf("Read char %c\n",c);
*/
for(i = 0; i < length; i++) for(i = 0; i < length; i++)
{ {
if(c == pTerm[i]) if(c == pTerm[i])
@ -518,13 +495,29 @@ int NETReadTillTermNew(mkChannel *self, int timeout,
return 1; return 1;
} }
} }
if(iBufLen - bufPtr > 0) if(c != 0) /* skip null characters */
{ {
if(bufPtr >= iBufLen-1)
{
return -1; /* overflow */
}
pBuffer[bufPtr] = c; pBuffer[bufPtr] = c;
bufPtr++; 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: This old version may be removed in some stage. It has two problems: