天天看點

readline函數 java_Linux網絡程式設計-readn函數、writen函數、readline函數實作

readn函數功能:在網絡程式設計的讀取資料中,通常會需要用到一個讀指定位元組才傳回的函數,linux系統調用中沒有給出,需要自己封裝。

readn實作代碼:

int readn(int fd, void *vptr, size_t n)

{

size_t          nleft = n;          //readn函數還需要讀的位元組數

ssize_t        nread = 0;          //read函數讀到的位元組數

unsigned char  *ptr = (char *)vptr; //指向緩沖區的指針

while (nleft > 0)

{

nread = read(fd, ptr, nleft);

if (-1 == nread)

{

if (EINTR == errno)

nread = 0;

else

return -1;

}

else if (0 == nread)

{

break;

}

nleft -= nread;

ptr += nread;

}

return n - nleft;

}

writen函數功能:讀滿n個位元組才傳回

writen代碼實作:

int writen(int fd, const void *vptr, size_t n)

{

size_t          nleft = n;  //writen函數還需要寫的位元組數

ssize_t        nwrite = 0; //write函數本次向fd寫的位元組數

const char*    ptr = vptr; //指向緩沖區的指針

while (nleft > 0)

{

if ((nwrite = write(fd, ptr, nleft)) <= 0)

{

if (nwrite < 0 && EINTR == errno)

nwrite = 0;

else

return -1;

}

nleft -= nwrite;

ptr += nwrite;

}

return n;

}

readline函數功能:讀到'\n'或者讀滿緩沖區才傳回

readline函數實作:

static ssize_t readch(int fd, char *ptr)

{

static int          count = 0;

static char*        read_ptr = 0;

static char        read_buf[1024*4] = {0};

if (count <= 0)

{

again:

count = read(fd, read_buf, sizeof(read_buf));

if (-1 == count)

if (EINTR == errno)

goto again;

else

return -1;

else if (0 == count)

return 0;

read_ptr = read_buf;

}

count--;

*ptr = *read_ptr++;

return 1;

}

ssize_t readline(int fd, void *vptr, size_t maxlen)

{

ssize_t        i = 0;

ssize_t        ret = 0;

char            ch = '\0';

char*          ptr = NULL;

ptr = (char *)vptr;

for (i = 1; i < maxlen; ++i)

{

ret = readch(fd, &ch);

if (1 == ret)

{

*ptr++ = ch;

if ('\n' == ch)

break;

}

else if (0 == ret)

{

*ptr = 0;

return i-1;

}

else

return -1;

}

*ptr = 0;

return i;

}

readline函數 java_Linux網絡程式設計-readn函數、writen函數、readline函數實作