I have this function where something very strange happens:
Code:
int DGRAMSocketRead_Wait ( int sock, char* iBuffer , unsigned int iToReadByteNumber, struct timeval * TimeOut, UINT32 * ReadByteNumber)
{
//to be tested with signaling simulation and partial read (client sends only part of the message or too slowly)
#if WINDOWS || WINDOWSCE
int errno;
#endif
// int ToReadByteNumber;
int RdByteNumber;
// unsigned char* Buffer;
fd_set mono_fd_set, read_fd_set;
int DataReady;
struct timeval TempTO;
Type_LogString LogString;
Type_PrefixString Prefix;
snprintf(Prefix,sizeof(Prefix),"DGRAMSocketRead_Wait::");
struct sockaddr from;
int sizeoffrom;
FD_ZERO (&mono_fd_set);
FD_SET (sock, &mono_fd_set);
//ToReadByteNumber = iToReadByteNumber;
RdByteNumber = -1;
//Buffer = iBuffer;
read_fd_set = mono_fd_set;
TempTO=*TimeOut;
//to be done upper limit on TimeOut in case of signal
DataReady= select (FD_SETSIZE, &read_fd_set, NULL, NULL, &TempTO);
while (DataReady < 0)
{
#if WINDOWS || WINDOWSCE
errno=WSAGetLastError();
//{snprintf(LogString,sizeof(LogString),"dbg:: errno %d",errno); Log(&Lg,Prefix,LogString,2,LOG_ON_ERROR_ALSO);}
//In the previous line : if I put snprintf out of comment it is not executed but the whole function works correctly reading the packet of the size expected!!??
//if I put snprintf under comment strangely enough I get : Log(&Lg,Prefix,"TIME OUT",2,LOG_ON_ERROR_ALSO);return MYSOCKET_USER_DEFINED_TIMEOUT;
#endif
#if LINUX
if (errno!=EINTR)
#endif
{
Log(&Lg,Prefix,"Read Error",2,LOG_ON_ERROR_ALSO);
return MYSOCKET_ERROR;
}
read_fd_set = mono_fd_set;
TempTO=*TimeOut;//TempT0;//it is not POSIX compliant to use TempTO cause it is not decremented in all implementations
DataReady=select (FD_SETSIZE, &read_fd_set, NULL, NULL, &TempTO);
}
if (!DataReady)
{
Log(&Lg,Prefix,"TIME OUT",2,LOG_ON_ERROR_ALSO);
*TimeOut=TempTO;
return MYSOCKET_USER_DEFINED_TIMEOUT;
}
while ( RdByteNumber < 0 )
{
//in case of EINTR chars should not be lost before the first read
RdByteNumber = recvfrom( sock , iBuffer , iToReadByteNumber, NULL, &from, &sizeoffrom );
#if WINDOWS || WINDOWSCE
errno=WSAGetLastError();
#endif
if ( RdByteNumber < 0 )
{
if (errno==MYEAGAIN || errno==MYEWOULDBLOCK )//some Linux do this if the data was lost after select() for some (strange) reason, like check sum
{
*ReadByteNumber=0;
return MYSOCKET_DATA_FALLEN;
}
else
#if LINUX
if ( errno != EINTR )//also SERVER_NON_CATASTROFIC_ERRNO must cause an error return code here
#endif
{
Log(&Lg,Prefix,"Read Error",2,LOG_ON_ERROR_ALSO);
return MYSOCKET_ERROR;
}
}
else if ( ReadByteNumber == 0 )
{
Log(&Lg,Prefix,"Connection closed",2,LOG_ON_ERROR_ALSO);
return MYSOCKET_CONNECTION_CLOSED;
}
else ;
//{
// ToReadByteNumber = ToReadByteNumber - ReadByteNumber;
// Buffer = Buffer + ReadByteNumber;
//}
}
*ReadByteNumber=RdByteNumber;
return MYSOCKET_OK;
}
where the strange behaviour is this in short:
Code:
//{snprintf(LogString,sizeof(LogString),"dbg:: errno %d",errno); Log(&Lg,Prefix,LogString,2,LOG_ON_ERROR_ALSO);}
//In the previous line : if I put snprintf out of comment it is not executed but the whole function works correctly reading the packet of the size expected!!??
//if I put snprintf under comment strangely enough I get : Log(&Lg,Prefix,"TIME OUT",2,LOG_ON_ERROR_ALSO);return MYSOCKET_USER_DEFINED_TIMEOUT;