6

(ソケットからの) Linux ファイル記述子があり、1 行を読みたいと思っています。C ++でそれを行う方法は?

4

4 に答える 4

3

行の終わりにいつ到達するかを想定できないTCPソケットから読み取っています。したがって、次のようなものが必要です。

std::string line;
char buf[1024];
int n = 0;
while(n = read(fd, buf, 1024))
{
   const int pos = std::find(buf, buf + n, '\n')
   if(pos != std::string::npos)
   {
       if (pos < 1024-1 && buf[pos + 1] == '\n')
          break;
   }
   line += buf;
}

line += buf;

区切り文字として「\n\n」を使用していると仮定します。(私はそのコード スニペットをテストしませんでした ;-) )

UDP ソケットでは、それは別の話です。エミッターは、行全体を含むパケットを送信する場合があります。受信側は、パケットを 1 つのユニットとして受信することが保証されています。受信した場合、UDP はもちろん TCP ほど信頼性が高くないためです。

于 2009-10-17T22:25:56.383 に答える
2

擬似コード:

char newline = '\n';
file fd;
initialize(fd);
string line;
char c;
while( newline != (c = readchar(fd)) ) {
 line.append(c);
}

そんな感じ。

于 2009-10-17T22:23:39.600 に答える
0

C++ ソケット ライブラリの使用:

クラス LineSocket : public TcpSocket
{
公衆:
  LineSocket(ISocketHandler& h) : TcpSocket(h) {
    SetLineProtocol(); // オンライン コールバックを有効にする
  }
  void OnLine(const std::string& line) {
    std::cout << "受信した行: " << 行 << std::endl;
    // ここに返信する
    {
      Send( "返信\n" );
    }
  }
};

上記のクラスを使用して:

int main()
{
  試す
  {
    SocketHandler h;
    LineSocket ソックス(h);
    sock.Open( "remote.host.com", ポート );
    h.Add(&sock);
    while (h.GetCount())
    {
      h.Select();
    }
  }
  catch (const Exception& e)
  {
    std::cerr << e.ToString() << std::endl;
  }
}

ライブラリはすべてのエラー処理を処理します。

Google を使用してライブラリを検索するか、次の直接リンクを使用してください: http://www.alhem.net/Sockets/

于 2009-10-18T07:10:32.560 に答える