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);
|
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:
|
||||||
|
Reference in New Issue
Block a user