Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Qt中比较到达的TCP/IP数据_C#_Qt_Networking_Tcp - Fatal编程技术网

C# 如何在Qt中比较到达的TCP/IP数据

C# 如何在Qt中比较到达的TCP/IP数据,c#,qt,networking,tcp,C#,Qt,Networking,Tcp,我试图将TCP客户端中的到达数据与QString进行比较。但我认为,这是一种用于比较的书写格式。我的TCP客户端是用Qt编写的,TCP服务器是用C#编写的。以下是Qt my read函数的示例代码: void MyClient::slotReadyRead() { QString okStr = "OK!"; ui->textEdit->append(okStr); ui->textEdit->append("Reading..."); Q

我试图将TCP客户端中的到达数据与QString进行比较。但我认为,这是一种用于比较的书写格式。我的TCP客户端是用Qt编写的,TCP服务器是用C#编写的。以下是Qt my read函数的示例代码:

void MyClient::slotReadyRead()
{
    QString okStr = "OK!";
    ui->textEdit->append(okStr);
    ui->textEdit->append("Reading...");
    QString str = socket->readAll();
    ui->textEdit->append(str);
    if(str == okStr)
        ui->textEdit->append("OK! is true");
    else
        ui->textEdit->append("OK! is false");
}
下面是C#服务器代码,用于编写命令“OK!”:

private void WriteOutput(Commands cmd)
{
    if (NS == null)
        return;

    string str = Enum.GetName(typeof(Commands), cmd);
    StreamWriter writer = new StreamWriter(NS);
    writer.WriteLine(str + "!");
    writer.Flush();
}
在这种情况下,cmd将是“OK”。在Qt TCP客户端中,我收到以下消息: 好的! 阅读。。。 好的!

好吧!这是假的
但是我希望有一个OK!是真的:)。我应该选择哪种数据格式?

我解决了它。问题是在windows中,新行不是'\n',而是'\r\n'。因此,如果我将windows上的
QString“OK!\n”
与到达的TCP数据“OK!\r\n”进行比较,我总是会得到“false”。一种解决方案是将我的
QString“OK!\r\n”
与到达的TCP数据“OK!\r\n”进行比较,或者第二种解决方案是使用Qt命令
QString kurzstr=str.section(“\r\n”,0,0);
以下是代码:

QString okStr = "OK!";
QString str = socket->readLine();
QString kurzstr = str.section("\r\n", 0, 0);
    if(okStr == kurzstr)
        ui->textEdit->append("OK! is true");
    else
        ui->textEdit->append("OK! is false");

如果您正在使用
标记应用程序级消息的结尾,那么您的读取函数必须一直读取,直到它读取
。TCP不会为您设置应用程序级消息的边界,您必须这样做。(或者您正在使用行分隔应用程序级消息?我们无法从您的代码中分辨。)请阅读到TCP问题的最后两段。我使用“\n”来分隔应用程序级消息。以下是writeline函数的描述:那么,在获得换行符之前,为什么不从套接字读取?但是如果我尝试比较:''QString okStr=“OK!\n”;ui->textEdit->append(okStr);ui->textEdit->append(“reading…”);QString str=socket->readAll();')如果这样做有效,那只能靠运气。你必须以与你写入套接字的方式相匹配的方式读取套接字。如果你以换行符分隔写入,那么你必须一直读到得到换行符。