(ソケットからの) Linux ファイル記述子があり、1 行を読みたいと思っています。C ++でそれを行う方法は?
10483 次
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 に答える