Corrected test version of NETReadTillTermNew M.Z.
This commit is contained in:
73
network.c
73
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:
|
||||
|
Reference in New Issue
Block a user