I have this function where something very strange happens:
where the strange behaviour is this in short: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; }
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;



LinkBack URL
About LinkBacks



