2012-02-22 11 views
1

read(fd, buf, BUFFLEN)を使用して特定の文字に達するまでソケットからバッファに読み込もうとしています。特定の文字がバッファに入るまでソケットから読み取る

たとえば、ソケットは、1回の読み取り呼び出しで空白行で区切られた2つのロット情報を受け取ります。

読み込み呼び出しをループに入れて、この空白行に達した時点で停止し、後で必要に応じて残りの情報を読み取ることはできますか?

+0

私はあなたの問題を正しく解釈していれば、最初のたくさんの情報を表示し、次の情報のために数秒待っていますか? – jasonkim

答えて

3

単純なアプローチは、前のバイトと現在のバイトが改行文字になるまで二つの連続する改行文字として、一度に1バイトを読むことであろうが、空白行です:

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

一度に1文字も私の最初の考えでしたが、一度に1文字ずつ読むのが難しいです: インライン ' 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

+0

@ DMcB1888、あなたは' buf [0] 'を使うときに' buf'の最初の2文字を '\ n \ n" 'と比較するしかありません。 'strstr(&buf [i - 1]、" \ n \ n ")'を試してください。 – hmjd

0

この情報に後でアクセスする場合は、引き続きソケットから読み取る必要があります。そうでない場合は、その情報は失われます。私は最高の実装は、空白のようなものが受信されたときに任意の操作を実行するために、別のプロセス/スレッドが起動されている間、ソケットからの読み込みループを維持することになると思います。

関連する問題