Browse Source

JackSocket: Continue read/write if only partly done

If a message was only written partly this has not to be interpreted as a
fatal error.
With this change it tries to continue reading/writing as long as there
are bytes read/written.

In addition errno is only valid in case of a return value of -1.
Therefore errno will only be read on a negative error value, now.

Change-Id: I4b46142c480e016b187bc606b248176eb23aefd8
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
pull/386/head
Timo Wischer Timo Wischer 7 years ago
parent
commit
4de4d7ffb0
1 changed files with 36 additions and 24 deletions
  1. +36
    -24
      posix/JackSocket.cpp

+ 36
- 24
posix/JackSocket.cpp View File

@@ -166,6 +166,8 @@ int JackClientSocket::Close()

int JackClientSocket::Read(void* data, int len)
{
int pos = 0;
uint8_t* buffer = (uint8_t*)data;
int res;

#if defined(__sun__) || defined(sun)
@@ -193,25 +195,31 @@ int JackClientSocket::Read(void* data, int len)
}
#endif

if ((res = read(fSocket, data, len)) != len) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_error("JackClientSocket::Read time out");
return 0; // For a non blocking socket, a read failure is not considered as an error
} else if (res != 0) {
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
//return 0;
return -1;
} else {
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
while ((res = read(fSocket, &buffer[pos], len)) != len) {
if (res < 0) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_error("JackClientSocket::Read time out");
return 0; // For a non blocking socket, a read failure is not considered as an error
} else {
jack_error("Cannot read socket fd = %d err = %s", fSocket, strerror(errno));
return -1;
}
} else if (res == 0) {
jack_error("Cannot read socket fd = %d err = connection closed", fSocket);
return -1;
}
} else {
return 0;

pos += res;
len -= res;
}

return 0;
}

int JackClientSocket::Write(void* data, int len)
{
int pos = 0;
uint8_t* buffer = (uint8_t*)data;
int res;

#if defined(__sun__) || defined(sun)
@@ -239,21 +247,25 @@ int JackClientSocket::Write(void* data, int len)
}
#endif

if ((res = write(fSocket, data, len)) != len) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_log("JackClientSocket::Write time out");
return 0; // For a non blocking socket, a write failure is not considered as an error
} else if (res != 0) {
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
//return 0;
return -1;
} else {
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
while ((res = write(fSocket, &buffer[pos], len)) != len) {
if (res < 0) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
jack_log("JackClientSocket::Write time out");
return 0; // For a non blocking socket, a write failure is not considered as an error
} else {
jack_error("Cannot write socket fd = %ld err = %s", fSocket, strerror(errno));
return -1;
}
} else if (res == 0) {
jack_error("Cannot write socket fd = %ld err = connection closed", fSocket);
return -1;
}
} else {
return 0;

pos += res;
len -= res;
}

return 0;
}

JackServerSocket::JackServerSocket(): fSocket( -1)


Loading…
Cancel
Save