UNIX: разработка сетевых приложений - Страница 34
Изменить размер шрифта:
void sock_set_wild(struct sockaddr *sockaddr, socklen_t addrlen);Функция
sock_bind_wildsock_cmp_addrsock_cmp_portsock_get_portsock_ntop_hostsock_set_addrptrsock_set_portsock_set_wild3.9. Функции readn, writen и readline
Потоковые сокеты (например, сокеты TCP) демонстрируют с функциями
readwritereadwritereadwritereadwritewritewritenВведем три функции для чтения и записи в потоковый сокет.
#include "unp.h"ssize_t readn(int filedes, void *buff, size_t nbytes);ssize_t writen(int filedes, const void *buff, size_t nbytes);ssize_t readline(int filedes, void *buff, size_t maxlen);Все функции возвращают: количество считанных или записанных байтов, -1 в случае ошибкиВ листинге 3.9 представлена функция
readnwritenreadlineЛистинг 3.9. Функция readn: считывание n байт из дескриптора
//lib/readn.c 1 #include "unp.h" 2 ssize_t /* Считывает n байт из дескриптора */ 3 readn(int fd, void *vptr, size_t n) 4 { 5 size_t nleft; 6 ssize_t nread; 7 char *ptr; 8 ptr = vptr; 9 nleft = n;10 while (nleft > 0) {11 if ((nread = read(fd, ptr, nleft)) < 0) {12 if (errno == EINTR)13 nread = 0; /* и вызывает снова функцию read() */14 else15 return (-1);16 } else if (nread == 0)17 break; /* EOF */18 nleft -= nread;19 ptr += nread;20 }21 return (n - nleft); /* возвращает значение >= 0 */22 }Листинг 3.10. Функция writen: запись n байт в дескриптор
//lib/writen.c 1 #include "unp.h" 2 ssize_t /* Записывает n байт в дескриптор */ 3 writen(int fd, const void *vptr, size_t n) 4 { 5 size_t nleft; 6 ssize_t nwritten; 7 const char *ptr; 8 ptr = vptr; 9 nleft = n;10 while (nleft > 0) {11 if ((nwritten = write(fd, ptr, nleft)) <= 0) {12 if (errno == EINTR)13 nwritten = 0; /* и снова вызывает функцию write() */14 else15 return (-1); /* ошибка */16 }17 nleft -= nwritten;18 ptr += nwritten;19 }20 return (n);21 }Листинг 3.11. Функция readline: считывание следующей строки из дескриптора, по одному байту за один раз
//test/readline1.с 1 #include "unp.h" /* Ужасно медленная версия, приводится только для примера */ 2 ssize_t 3 readline(int fd, void *vptr, size_t maxlen)