Hi Mattias,

Thanks for the input and clarification. I will include these changes in the v6.

Regards,
Kevin

On 22/10/2018 08:11, Mattias Rönnblom wrote:
On 2018-10-19 12:16, Laatz, Kevin wrote:
On 03/10/2018 20:06, Mattias Rönnblom wrote:
On 2018-10-03 19:36, Kevin Laatz wrote:
From: Ciara Power <ciara.po...@intel.com>
+
+    if (!telemetry->request_client) {
+        TELEMETRY_LOG_ERR("No client has been chosen to write to");
+        return -1;
+    } > +
+    if (!json_string) {
+        TELEMETRY_LOG_ERR("Invalid JSON string!");
+        return -1;
+    }
+
+    ret = send(telemetry->request_client->fd,
+            json_string, strlen(json_string), 0);

How would this code handle a partial success (as in, for example, half of the string fits the socket buffer)? In not, maybe switching over to a SOCK_SEQPACKET AF_UNIX socket would be the best way around it.

Is the suggestion here simply to use socket(AF_UNIX, SOCK_SEQPACKET) instead of (AF_UNIX, SOCK_STREAM) ?

That would be the most straight-forward to the problem, I think. Linux' SOCK_SEQPACKET implementation has problems with really large messages (since a per-message linear buffer is allocated), but I'm guessing these messages are not in the hundreds-of-kb range.


+
+    buffer_read = read(telemetry->accept_fd, buf, BUF_SIZE-1);

This and the below code seem to assume that read() returns one and only one message, but on a SOCK_STREAM, there is no such thing as a message. It's a byte stream, and you need to provide your own framing, or have an application protocol which allows only have one outstanding request. If you do the latter, you still need to allow for "short" (partial) read()s (i.e. re-read() until done).

Will the above solve this part of the problem too?


Yes. The kernel will delivered the application (at most) one message, in its entirety.

Reply via email to