corrected bad specified timeouts (ms versus us) M.Z.
This commit is contained in:
49
network.c
49
network.c
@ -159,7 +159,7 @@ CreateSocketAdress(
|
|||||||
}
|
}
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
mkChannel *NETAccept(mkChannel *self, int timeout)
|
mkChannel *NETAccept(mkChannel *self, long timeout)
|
||||||
{
|
{
|
||||||
mkChannel *pRes = NULL;
|
mkChannel *pRes = NULL;
|
||||||
int iRet;
|
int iRet;
|
||||||
@ -173,7 +173,8 @@ CreateSocketAdress(
|
|||||||
if(timeout > 0)
|
if(timeout > 0)
|
||||||
{
|
{
|
||||||
/* select first */
|
/* select first */
|
||||||
tmo.tv_usec = timeout;
|
tmo.tv_usec = (timeout % 1000) * 1000;
|
||||||
|
tmo.tv_sec = timeout / 1000;
|
||||||
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 */
|
||||||
@ -336,7 +337,8 @@ CreateSocketAdress(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* setup for select first */
|
#ifndef CYGNUS
|
||||||
|
/* setup for select first */
|
||||||
tmo.tv_usec = 100;
|
tmo.tv_usec = 100;
|
||||||
FD_ZERO(&lMask);
|
FD_ZERO(&lMask);
|
||||||
FD_SET(self->sockid,&lMask);
|
FD_SET(self->sockid,&lMask);
|
||||||
@ -345,7 +347,6 @@ CreateSocketAdress(
|
|||||||
{
|
{
|
||||||
return -1; /* eof */
|
return -1; /* eof */
|
||||||
}
|
}
|
||||||
#ifndef CYGNUS
|
|
||||||
iRet = select( (self->sockid + 1),NULL, &lMask, NULL,&tmo);
|
iRet = select( (self->sockid + 1),NULL, &lMask, NULL,&tmo);
|
||||||
if( iRet <= 0)
|
if( iRet <= 0)
|
||||||
{
|
{
|
||||||
@ -375,7 +376,7 @@ CreateSocketAdress(
|
|||||||
|
|
||||||
}
|
}
|
||||||
/* -------------------------------------------------------------------------*/
|
/* -------------------------------------------------------------------------*/
|
||||||
long NETRead(mkChannel *self, char *buffer, long lLen, int timeout)
|
long NETRead(mkChannel *self, char *buffer, long lLen, long timeout)
|
||||||
{
|
{
|
||||||
fd_set lMask;
|
fd_set lMask;
|
||||||
struct timeval tmo ={0,1};
|
struct timeval tmo ={0,1};
|
||||||
@ -389,8 +390,8 @@ CreateSocketAdress(
|
|||||||
if(timeout > 0)
|
if(timeout > 0)
|
||||||
{
|
{
|
||||||
/* setup for select first */
|
/* setup for select first */
|
||||||
tmo.tv_usec = timeout % 1000000;
|
tmo.tv_usec = (timeout % 1000) *1000;
|
||||||
tmo.tv_sec = timeout / 1000000;
|
tmo.tv_sec = timeout / 1000;
|
||||||
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, long timeout)
|
||||||
{
|
{
|
||||||
fd_set lMask;
|
fd_set lMask;
|
||||||
struct timeval tmo ={0,1};
|
struct timeval tmo ={0,1};
|
||||||
@ -436,8 +437,8 @@ CreateSocketAdress(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* setup for select */
|
/* setup for select */
|
||||||
tmo.tv_usec = timeout % 1000000;
|
tmo.tv_usec = (timeout % 1000) * 1000;
|
||||||
tmo.tv_sec = timeout / 1000000;
|
tmo.tv_sec = timeout / 1000;
|
||||||
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) )
|
||||||
@ -460,23 +461,25 @@ CreateSocketAdress(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
int NETReadTillTermNew(mkChannel *self, int timeout,
|
int NETReadTillTermNew(mkChannel *self, long timeout,
|
||||||
char *pTerm, char *pBuffer, int iBufLen)
|
char *pTerm, char *pBuffer, int iBufLen)
|
||||||
{
|
{
|
||||||
time_t maxTime, now;
|
struct timeval start, now;
|
||||||
int bufPtr = 0, status, i, length;
|
int bufPtr = 0, status, i, length;
|
||||||
char c;
|
char c;
|
||||||
|
long dif;
|
||||||
|
|
||||||
if(!VerifyChannel(self))
|
if(!VerifyChannel(self))
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxTime = time(NULL) + (time_t)ceil((double)timeout/1000 +1);
|
gettimeofday(&start, NULL);
|
||||||
|
|
||||||
length = strlen(pTerm);
|
length = strlen(pTerm);
|
||||||
memset(pBuffer,0,iBufLen);
|
memset(pBuffer,0,iBufLen);
|
||||||
|
|
||||||
status = NETAvailable(self,timeout*1000); /* first time: full timeout */
|
status = NETAvailable(self,timeout); /* first time: full timeout */
|
||||||
if(status <= 0) /* return on error or on timeout */
|
if(status <= 0) /* return on error or on timeout */
|
||||||
{
|
{
|
||||||
return status;
|
return status;
|
||||||
@ -484,7 +487,7 @@ int NETReadTillTermNew(mkChannel *self, int timeout,
|
|||||||
while (status > 0)
|
while (status > 0)
|
||||||
{
|
{
|
||||||
status = recv(self->sockid,&c,1,0);
|
status = recv(self->sockid,&c,1,0);
|
||||||
if(status < 0)
|
if(status <= 0)
|
||||||
{
|
{
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
@ -492,7 +495,7 @@ int NETReadTillTermNew(mkChannel *self, int timeout,
|
|||||||
{
|
{
|
||||||
if(c == pTerm[i])
|
if(c == pTerm[i])
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(c != 0) /* skip null characters */
|
if(c != 0) /* skip null characters */
|
||||||
@ -509,14 +512,17 @@ int NETReadTillTermNew(mkChannel *self, int timeout,
|
|||||||
/*
|
/*
|
||||||
wait for more data
|
wait for more data
|
||||||
*/
|
*/
|
||||||
status = NETAvailable(self,1); /* minimal timeout */
|
status = NETAvailable(self,0); /* timeout 0 (just poll) */
|
||||||
while (status == 0)
|
if (status == 0 && timeout > 0)
|
||||||
{
|
{
|
||||||
if(time(NULL) > maxTime)
|
gettimeofday(&now, NULL);
|
||||||
|
dif = (now.tv_sec-start.tv_sec)*1000+(now.tv_usec-start.tv_usec)/1000;
|
||||||
|
|
||||||
|
if(dif > timeout)
|
||||||
{
|
{
|
||||||
return 0; /* timeout */
|
return 0; /* timeout */
|
||||||
}
|
}
|
||||||
status = NETAvailable(self,100000); /* 0.1 s timeout */
|
status = NETAvailable(self,timeout-dif);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return status;
|
return status;
|
||||||
@ -737,7 +743,8 @@ This old version may be removed in some stage. It has two problems:
|
|||||||
if(timeout > 0)
|
if(timeout > 0)
|
||||||
{
|
{
|
||||||
/* setup for select first */
|
/* setup for select first */
|
||||||
tmo.tv_usec = timeout;
|
tmo.tv_usec = (timeout % 1000) *1000;
|
||||||
|
tmo.tv_sec = timeout / 1000;
|
||||||
lMask = (1 << self->sockid);
|
lMask = (1 << self->sockid);
|
||||||
iRet = select( (self->sockid + 1),(fd_set *)&lMask, NULL, NULL,&tmo);
|
iRet = select( (self->sockid + 1),(fd_set *)&lMask, NULL, NULL,&tmo);
|
||||||
if( iRet <= 0)
|
if( iRet <= 0)
|
||||||
|
19
network.h
19
network.h
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
Mark Koennecke, October 2001
|
Mark Koennecke, October 2001
|
||||||
|
|
||||||
|
Changed all timeout units from microseconds to milliseconds
|
||||||
|
Markus Zolliker August 2004
|
||||||
----------------------------------------------------------------------------*/
|
----------------------------------------------------------------------------*/
|
||||||
#ifndef NNNET
|
#ifndef NNNET
|
||||||
#define NNNET
|
#define NNNET
|
||||||
@ -44,12 +46,12 @@
|
|||||||
else a valid mkChannel structure for the port
|
else a valid mkChannel structure for the port
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mkChannel *NETAccept(mkChannel *self, int timeout);
|
mkChannel *NETAccept(mkChannel *self, long timeout);
|
||||||
/* tries to accept a new connection on the Channel self
|
/* tries to accept a new connection on the Channel self
|
||||||
until timeout. If a connection can be built a new mkChannel
|
until timeout. If a connection can be built a new mkChannel
|
||||||
structure is returned, else NULL. With a negative value or 0 for
|
structure is returned, else NULL. With a negative value or 0 for
|
||||||
timeout this function blocks for an accept.
|
timeout this function blocks for an accept.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mkChannel *NETConnect(char *name, int port);
|
mkChannel *NETConnect(char *name, int port);
|
||||||
/* tries to open a client connection to the server specified by name
|
/* tries to open a client connection to the server specified by name
|
||||||
@ -69,17 +71,18 @@
|
|||||||
false otherwise.
|
false otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
long NETRead(mkChannel *self, char *buffer, long lLen, int timeout);
|
long NETRead(mkChannel *self, char *buffer, long lLen, long timeout);
|
||||||
/* reads data from socket self into buffer with max length lLen
|
/* reads data from socket self into buffer with max length lLen
|
||||||
waits maximum timeout for data. Returns -1 on error, 0 on no
|
waits maximum timeout for data. Returns -1 on error, 0 on no
|
||||||
data, and else the length of the data read. With a negative value
|
data, and else the length of the data read. With a negative value
|
||||||
or 0 for timeout this function blocks for the read.
|
or 0 for timeout this function blocks for the read.
|
||||||
*/
|
*/
|
||||||
int NETAvailable(mkChannel *self, int timeout);
|
int NETAvailable(mkChannel *self, long timeout);
|
||||||
/*
|
/* returns 1 if data is pending on the port, 0 if none is
|
||||||
returns 1 if data is pending on the port, 0 if none is
|
|
||||||
pending.
|
pending.
|
||||||
*/
|
*/
|
||||||
|
int NETReadTillTermNew(mkChannel *self, long timeout,
|
||||||
|
char *pTerm, char *pBuffer, int iBufLen);
|
||||||
int NETReadTillTerm(mkChannel *self, int timeout,
|
int NETReadTillTerm(mkChannel *self, int timeout,
|
||||||
char *pTerm, char *pBuffer, int iBufLen);
|
char *pTerm, char *pBuffer, int iBufLen);
|
||||||
/*
|
/*
|
||||||
@ -91,6 +94,8 @@
|
|||||||
and a negative value if a network error occurred. Beware that
|
and a negative value if a network error occurred. Beware that
|
||||||
this may not work correctly if the wrong terminator is given.
|
this may not work correctly if the wrong terminator is given.
|
||||||
The last one is really needed.
|
The last one is really needed.
|
||||||
|
In the new version, timeout is in MILLIseconds (10 -3 sec).
|
||||||
|
However, the accuracy is machine dependent (for Linux 10 ms, for Tru64 1 ms)
|
||||||
*/
|
*/
|
||||||
/* ********************* KILLING FIELD ******************************** */
|
/* ********************* KILLING FIELD ******************************** */
|
||||||
int NETClosePort(mkChannel *self);
|
int NETClosePort(mkChannel *self);
|
||||||
|
@ -123,10 +123,10 @@ int writeRS232(prs232 self, void *data, int dataLen)
|
|||||||
iRet = NETWrite(self->pSock,data,dataLen);
|
iRet = NETWrite(self->pSock,data,dataLen);
|
||||||
if(self->debug > 0)
|
if(self->debug > 0)
|
||||||
{
|
{
|
||||||
printf("RS232 OUT: %s",(char *)data);
|
printf("RS232 OUT : %s",(char *)data);
|
||||||
if(strchr((char *)data,'\n') == NULL)
|
if(strchr((char *)data,'\n') == NULL)
|
||||||
{
|
{
|
||||||
puts("\n");
|
puts("");
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -175,10 +175,10 @@ int readRS232(prs232 self, void *data, int *dataLen)
|
|||||||
{
|
{
|
||||||
if(self->debug > 0)
|
if(self->debug > 0)
|
||||||
{
|
{
|
||||||
printf("RS232 IN: %s",(char *)data);
|
printf("RS232 IN : %s",(char *)data);
|
||||||
if(strchr((char *)data,'\n') == NULL)
|
if(strchr((char *)data,'\n') == NULL)
|
||||||
{
|
{
|
||||||
puts("\n");
|
puts("");
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -211,14 +211,14 @@ int readRS232TillTerm(prs232 self, void *data, int *datalen){
|
|||||||
|
|
||||||
memset(data,0,*datalen);
|
memset(data,0,*datalen);
|
||||||
replylen = *datalen;
|
replylen = *datalen;
|
||||||
iRet = NETReadTillTerm(self->pSock,self->timeout,self->replyTerminator,
|
iRet = NETReadTillTermNew(self->pSock,self->timeout,self->replyTerminator,
|
||||||
(char *)data, replylen);
|
(char *)data, replylen);
|
||||||
if(self->debug > 0)
|
if(self->debug > 0)
|
||||||
{
|
{
|
||||||
printf("RS232 IN/TERM: %s",(char *)data);
|
printf("RS232 IN/TERM : %s",(char *)data);
|
||||||
if(strchr((char *)data,'\n') == NULL)
|
if(strchr((char *)data,'\n') == NULL)
|
||||||
{
|
{
|
||||||
puts("\n");
|
puts("");
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -231,6 +231,10 @@ int readRS232TillTerm(prs232 self, void *data, int *datalen){
|
|||||||
printf("Incomplete read: %s\n", (char *)data);
|
printf("Incomplete read: %s\n", (char *)data);
|
||||||
return INCOMPLETE;
|
return INCOMPLETE;
|
||||||
}
|
}
|
||||||
|
else if (iRet < 0)
|
||||||
|
{
|
||||||
|
return iRet;
|
||||||
|
}
|
||||||
*datalen = strlen((char *)data);
|
*datalen = strlen((char *)data);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -247,7 +251,7 @@ int availableRS232(prs232 self)
|
|||||||
return NOTCONNECTED;
|
return NOTCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NETAvailable(self->pSock,3);
|
return NETAvailable(self->pSock,0);
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
int availableNetRS232(prs232 self)
|
int availableNetRS232(prs232 self)
|
||||||
@ -312,14 +316,14 @@ int transactRS232(prs232 self, void *send, int sendLen,
|
|||||||
read
|
read
|
||||||
*/
|
*/
|
||||||
memset(reply,0,replyLen);
|
memset(reply,0,replyLen);
|
||||||
iRet = NETReadTillTerm(self->pSock,self->timeout,self->replyTerminator,
|
iRet = NETReadTillTermNew(self->pSock,self->timeout,self->replyTerminator,
|
||||||
reply, replyLen);
|
reply, replyLen);
|
||||||
if(self->debug > 0)
|
if(self->debug > 0)
|
||||||
{
|
{
|
||||||
printf("RS232 IN/TRANS: %s",(char *)reply);
|
printf("RS232 IN/TRANS: %s",(char *)reply);
|
||||||
if(strchr((char *)reply,'\n') == NULL)
|
if(strchr((char *)reply,'\n') == NULL)
|
||||||
{
|
{
|
||||||
puts("\n");
|
puts("");
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
@ -389,6 +393,7 @@ int initRS232(prs232 self)
|
|||||||
NetReadRemoveUserSocket(pServ->pReader,self->pSock->sockid);
|
NetReadRemoveUserSocket(pServ->pReader,self->pSock->sockid);
|
||||||
}
|
}
|
||||||
NETClosePort(self->pSock);
|
NETClosePort(self->pSock);
|
||||||
|
free(self->pSock);
|
||||||
self->pSock = NULL;
|
self->pSock = NULL;
|
||||||
}
|
}
|
||||||
self->pSock = NETConnect(self->pHost, self->iPort);
|
self->pSock = NETConnect(self->pHost, self->iPort);
|
||||||
@ -422,6 +427,7 @@ prs232 createRS232(char *host, int iPort)
|
|||||||
pNew->sendTerminator = strdup("\r");
|
pNew->sendTerminator = strdup("\r");
|
||||||
pNew->replyTerminator = strdup("\n");
|
pNew->replyTerminator = strdup("\n");
|
||||||
pNew->timeout = 1000;
|
pNew->timeout = 1000;
|
||||||
|
pNew->debug = 0;
|
||||||
pNew->pDes = CreateDescriptor("RS232 Controller");
|
pNew->pDes = CreateDescriptor("RS232 Controller");
|
||||||
if(!pNew->pDes || !pNew->pHost ||
|
if(!pNew->pDes || !pNew->pHost ||
|
||||||
!pNew->replyTerminator || !pNew->sendTerminator)
|
!pNew->replyTerminator || !pNew->sendTerminator)
|
||||||
@ -457,6 +463,7 @@ prs232 createRS232(char *host, int iPort)
|
|||||||
NetReadRemoveUserSocket(pServ->pReader,self->pSock->sockid);
|
NetReadRemoveUserSocket(pServ->pReader,self->pSock->sockid);
|
||||||
}
|
}
|
||||||
NETClosePort(self->pSock);
|
NETClosePort(self->pSock);
|
||||||
|
free(self->pSock);
|
||||||
}
|
}
|
||||||
if(self->pHost)
|
if(self->pHost)
|
||||||
{
|
{
|
||||||
@ -761,26 +768,14 @@ int RS232Factory(SConnection *pCon, SicsInterp *pSics,
|
|||||||
/*
|
/*
|
||||||
create data structure and open port
|
create data structure and open port
|
||||||
*/
|
*/
|
||||||
pNew = (prs232)malloc(sizeof(rs232));
|
pNew = createRS232(argv[2], atoi(argv[3]));
|
||||||
|
|
||||||
if(!pNew)
|
if(!pNew)
|
||||||
{
|
{
|
||||||
SCWrite(pCon,"ERROR: out of memory in RS232Factory",eError);
|
SCWrite(pCon,"ERROR: out of memory in RS232Factory",eError);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memset(pNew, 0, sizeof(rs232));
|
|
||||||
|
|
||||||
pNew->pHost = strdup(argv[2]);
|
|
||||||
pNew->iPort = atoi(argv[3]);
|
|
||||||
pNew->sendTerminator = strdup("\r");
|
|
||||||
pNew->replyTerminator = strdup("\n");
|
|
||||||
pNew->timeout = 1000;
|
|
||||||
pNew->pDes = CreateDescriptor("RS232 Controller");
|
|
||||||
if(!pNew->pDes || !pNew->pHost ||
|
|
||||||
!pNew->replyTerminator || !pNew->sendTerminator)
|
|
||||||
{
|
|
||||||
SCWrite(pCon,"ERROR: out of memory in RS232Factory",eError);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
status = initRS232(pNew);
|
status = initRS232(pNew);
|
||||||
if(status != 1)
|
if(status != 1)
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,10 @@
|
|||||||
Use internal connection.
|
Use internal connection.
|
||||||
Mark Koennecke, July 2002
|
Mark Koennecke, July 2002
|
||||||
|
|
||||||
|
changed timeout units in NETRead from us to ms
|
||||||
|
the timing could be optimized (no need for SicsWait
|
||||||
|
when timeout properly choosen (could be in the region of 1 second )
|
||||||
|
M.Zolliker, August 04
|
||||||
*/
|
*/
|
||||||
#include "sics.h"
|
#include "sics.h"
|
||||||
#include "network.h"
|
#include "network.h"
|
||||||
@ -34,7 +38,7 @@ static void syncLogin(void)
|
|||||||
connection = NETConnect(hostname, port);
|
connection = NETConnect(hostname, port);
|
||||||
for(i = 0; i < 10; i++)
|
for(i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
NETRead(connection,pBueffel,1020,10*1000);
|
NETRead(connection,pBueffel,1020,10); /* 10 ms M.Z */
|
||||||
if(strstr(pBueffel,"OK") != NULL)
|
if(strstr(pBueffel,"OK") != NULL)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@ -60,7 +64,7 @@ static void syncLogin(void)
|
|||||||
for(i = 0; i < 60; i++)
|
for(i = 0; i < 60; i++)
|
||||||
{
|
{
|
||||||
memset(pRead,0,80);
|
memset(pRead,0,80);
|
||||||
test = NETRead(connection,pRead,70,10*1000);
|
test = NETRead(connection,pRead,70,10); /* 10 ms M.Z. */
|
||||||
if(test < 0)
|
if(test < 0)
|
||||||
{
|
{
|
||||||
NETClosePort(connection);
|
NETClosePort(connection);
|
||||||
@ -212,7 +216,7 @@ int Synchronize(SConnection *pCon, SicsInterp *pSics, void *pData,
|
|||||||
for(i = 0; i < 60; i++)
|
for(i = 0; i < 60; i++)
|
||||||
{
|
{
|
||||||
pRead[0] = '\0';
|
pRead[0] = '\0';
|
||||||
test = NETRead(connection,pRead,75,20*1000);
|
test = NETRead(connection,pRead,75,20); /* 20 ms M.Z. */
|
||||||
if(test < 0)
|
if(test < 0)
|
||||||
{
|
{
|
||||||
NETClosePort(connection);
|
NETClosePort(connection);
|
||||||
|
Reference in New Issue
Block a user