Important Update:
- SelectableCore:
- Finish UDP implementation
- Change UDPsock to UDPserver/client/remote
- Add OpenUDPserver/client/remote methods
- Add ReadFrom/WriteToUDP() methods (cannot write to FD)
- ReadFrom/WriteToFD():
- return negative bytes on error
- small delay between consecutive reads/writes
- Set address correctly on resolve (for UDP or TCP)
- Improve ReadFrom/WriteToFD() methods (improved timing & error)
- Improve error reporting on Input/OutputHandle() methods
- CharBufferCore:
- Standardise ReadFrom/WriteToFD() method
- Bug fix: Peek/PeekCopy error if Data param not passed
- FileCore
- Standardise ReadFrom/WriteToFD() method
This commit is contained in:
33
FileCore.cpp
33
FileCore.cpp
@@ -185,7 +185,8 @@ int CFileCore::ReadFromFD( int FD, char * Data, int MaxLen )
|
||||
{
|
||||
int BytesRead = 0;
|
||||
int TotalRead = 0;
|
||||
int DataRemain = 0;
|
||||
int DataRemain = MaxLen;
|
||||
bool Error = false;
|
||||
|
||||
// Check if buffer created
|
||||
if ((FD == -1) || !Data) {
|
||||
@@ -193,20 +194,26 @@ int CFileCore::ReadFromFD( int FD, char * Data, int MaxLen )
|
||||
}
|
||||
|
||||
// Read Data into buffer
|
||||
DataRemain = (MaxLen == -1)? strlen(Data) : MaxLen;
|
||||
while (DataRemain)
|
||||
{
|
||||
// Read from file descriptor
|
||||
BytesRead = read( FD, &Data[TotalRead], DataRemain );
|
||||
if (BytesRead <= 0)
|
||||
if (BytesRead <= 0) {
|
||||
Error = true;
|
||||
errno = (!BytesRead)? 0 : errno; // No error if no bytes written
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Data Pointers
|
||||
TotalRead += BytesRead;
|
||||
DataRemain -= BytesRead;
|
||||
|
||||
if (DataRemain) {
|
||||
usleep( 500 );
|
||||
}
|
||||
}
|
||||
|
||||
return TotalRead;
|
||||
return (Error)? -TotalRead : TotalRead; // Report negative total on error
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -214,28 +221,34 @@ int CFileCore::WriteToFD( int FD, const char * Data, int Len )
|
||||
{
|
||||
int BytesWritten = 0;
|
||||
int TotalWritten = 0;
|
||||
int DataRemain = 0;
|
||||
int DataRemain = (Len != -1)? Len : (Data)? strlen(Data) : 0;
|
||||
bool Error = false;
|
||||
|
||||
// Check if buffer created
|
||||
if ((FD == -1) || !Data) {
|
||||
if ((FD == -1) || !DataRemain) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Read Data into buffer
|
||||
DataRemain = (Len == -1)? strlen(Data) : Len;
|
||||
while (DataRemain)
|
||||
{
|
||||
// Read from file descriptor
|
||||
BytesWritten = write( FD, &Data[TotalWritten], DataRemain );
|
||||
if ((BytesWritten <= 0) && (errno != EAGAIN))
|
||||
if ((BytesWritten <= 0) && (errno != EAGAIN)) {
|
||||
Error = true;
|
||||
errno = (!BytesWritten)? 0 : errno; // No error if no bytes written
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Data Pointers
|
||||
TotalWritten += BytesWritten;
|
||||
DataRemain -= BytesWritten;
|
||||
}
|
||||
|
||||
return TotalWritten;
|
||||
if (DataRemain) {
|
||||
usleep( 500 );
|
||||
}
|
||||
}
|
||||
return (Error)? -TotalWritten : TotalWritten; // Report negative total on error
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
Reference in New Issue
Block a user