read(int fd, void *buf, size_t count)
的話,只要有封包延遲的狀況下,回傳的buf裡面所存的值就不會是原本另外一端想要傳輸的了。
所以我們必須要自己implement一個readline的funciton,只要還沒讀到換行符號的狀況下就繼續等待一直讀,如果被其他signal interrupt的話也不能停,一直到結束為止。
int readline(int fd, void *vptr, size_t maxlen )
{
ssize_t n, rc;
char c, *ptr;
ptr = (char*)vptr;
for (n = 1; n < maxlen; n++) {
again:
if ( (rc = read(fd, &c, 1)) == 1) {
*ptr++ = c;
if (c == '\n')
break; /* newline is stored, like fgets() */
} else if (rc == 0) {
*ptr = 0;
return(n - 1); /* EOF, n - 1 bytes were read */
} else {
if (errno == EINTR) /* This is when read has been interrupt*/
goto again;
return(-1); /* error, errno set by read() */
}
}
*ptr = 0; /* null terminate like fgets() */
return n;
}
在Unix Network Programming一書上的版本與此差不多,然而還有更快的版本,這個相對比較慢。
沒有留言:
張貼留言