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一書上的版本與此差不多,然而還有更快的版本,這個相對比較慢。
沒有留言:
張貼留言