2012-02-22 52 views
1

我試圖從套接字讀取緩衝區,直到使用read(fd, buf, BUFFLEN)達到某個字符。從套接字讀取,直到某個字符處於緩衝區中

例如,套接字將在一次讀取調用中接收到由空行分隔的兩批信息。

是否可以將讀取的調用放入循環中,以便它在到達此空行時停止,然後在需要時可以讀取其餘的信息?

+0

如果我對你的問題有正確的解釋,你想顯示第一批信息,然後閒置幾秒鐘爲下一個? – jasonkim 2012-02-22 16:33:23

回答

3

一個簡單的方法是在同一時間讀取單個字節,直到前一字節,當前字節是換行字符,爲連續兩次換行字符是一個空行:

size_t buf_idx = 0; 
char buf[BUFFLEN] = { 0 }; 

while (buf_idx < BUFFLEN && 1 == read(fd, &buf[buf_idx], 1) 
{ 
    if (buf_idx > 0   && 
     '\n' == buf[buf_idx] && 
     '\n' == buf[buf_idx - 1]) 
    { 
     break; 
    } 
    buf_idx++; 
} 

如果要讀取新發送的數據,任何未讀數據都必須在某一時刻讀取。

+0

一個角色一次也是我最初的想法,但我很難讓它一次讀取一個: inline' int rlen; int i = 0; 而((RLEN =讀(proxyFd,&BUF [I],1))> 0) { \t \t \t如果(的strstr(BUF [0], 「\ n \ n」 個)) \t { \t \t printf(「賓果\ n」); \t \t break; \t} \t i + = rlen; } ' – DMcB1888 2012-02-22 16:21:11

+0

@ DMcB1888,當你使用'buf [0]'時,你只會比較'buf'中的前兩個字符到''\ n \ n「'。試試'strstr(&buf [i - 1],「\ n \ n」)',但** make **確定'i> 0'。 – hmjd 2012-02-22 16:26:31

0

如果您想稍後訪問此信息,您仍然需要從套接字讀取,否則它將丟失。我認爲最好的實現是保持從套接字循環讀取,而另一個進程/線程啓動時執行您希望收到空白時的任何操作。