Количество байтов == количество символов, поскольку стандарт C требует, чтобы char
было 1-байтовым целым числом.
write()
:
Да, он возвращает количество записанных байтов. Но: это не всегда ошибка, если она не возвращает столько байтов, сколько должно быть написано. Особенно не для связи по TCP. Сокет может быть неблокирующим или просто занятым, в этом случае вам нужно будет переписать еще не записанные байты. Такое поведение может быть достигнуто так:
char *buf = (however you acquire your byte buffer);
ssize_t len = (total number of bytes to be written out);
while (len > 0)
{
ssize_t written = write(sockfd, buf, len);
if (written < 0)
{
/* now THAT is an error */
break;
}
len -= written;
buf += written; /* tricky pointer arythmetic */
}
read()
:
То же самое применимо и здесь, с той лишь разницей, что EOF указывается возвращением 0, и это не ошибка. Опять же, вы должны повторить чтение, если хотите получить все доступные данные из сокета.
int readbytes = 0;
char buf[512];
do {
readbytes = read(sockfd, buf, 512);
if (readbytes < 0)
{
/* error */
break;
}
if (readbytes > 0)
{
/* process your freshly read data chunk */
}
} while (readbytes > 0); /* until EOF */
Вы можете увидеть мою реализацию простого вспомогательного класса TCP с использованием этой техники на https://github.com/H2CO3/TCPHelper/blob/master/TCPHelper.m