2012年10月31日 星期三

Socket Programming - Readline

    在我們撰寫網路應用程式的時候,通常我們對於字串上都要另外去特別處理,因為網路不一定是穩定的狀況下,就算是TCP connection都會有所謂的delay,如果我們就僅只是直接呼叫
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一書上的版本與此差不多,然而還有更快的版本,這個相對比較慢。

沒有留言: