---
name: "iob_send"
section: "3diet"
platform: "linux"
package: "libowfat-dev"
version: "0.28-2"
release: "Debian 6.0 (Squeeze)"
platforms: ["linux"]
url: "https://new.carta.tech/iob_send/3diet"
---

# iob\_send(3diet)

send I/O batch

## NAME

iob\_send - send I/O batch

## SYNTAX

**#include \<iob.h\>**

int64 **iob\_send**(int64 s,io\_batch\* b);

## DESCRIPTION

iob\_send sends the (rest of) *b* over the socket *s*.

iob\_send returns the number of bytes written, 0 if there were no more bytes to be written in the batch, -1 for EAGAIN, or -3 for a permanent error (for example "connection reset by peer").

The normal usage pattern is using io\_wait to know when a descriptor is writable, and then calling iob\_send until it returns 0, -1 or -3.

If it returns 0, terminate the loop (everything was written OK).  If it returns -1, call io\_wait again.  If it returned -3, signal an error and close the socket.

The benefit of the I/O batch API is that it exploits platform specific APIs like FreeBSD's sendfile.  The file contents will always be sent in a way that allows the operating systems to perform zero copy TCP, and the buffers will always be sent using as few syscalls as possible and avoiding unnecessary copying (using writev).

## SEE ALSO

[iob\_reset(3)](/iob_reset/3.md), [iob\_send(3)](/iob_send/3.md), [iob\_addbuf(3)](/iob_addbuf/3.md), [iob\_adds\_free(3)](/iob_adds_free/3.md), [iob\_addfile(3)](/iob_addfile/3.md), [iob\_prefetch(3)](/iob_prefetch/3.md)
