【问题标题】:Sending data over socket from C server to qt Client通过套接字从 C 服务器向 qt 客户端发送数据
【发布时间】:2013-12-26 13:01:32
【问题描述】:

我这里有点问题:

我有一个简单的 C 服务器(不能使用 Qt TcpServer,嵌入式板的限制),它使用 send()double 数据(由 GPIO 端口生成) /强>。如果我有一个简单的 C 客户端(在我的 Linux PC 中),那么我可以获取在 recv() 的帮助下生成的实时数据。这是我的服务器代码:

int main (void){
    int s,b,l,fd,sa,bytes,on=1;
    char buf[BUF_SIZE],fname[255];
    struct sockaddr_in channel;

    long long sum=0;
    double average=0;
    int i,j;
    int srno=0;

    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(s<0)
    {
        printf("socket creation failure");
        exit(0);
    }
    setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&on,sizeof(on));
    memset(&channel,0,sizeof(channel));
    channel.sin_family=AF_INET;
    channel.sin_addr.s_addr=htonl(INADDR_ANY);
    channel.sin_port=htons(SERVER_PORT);
    b=bind(s, (struct sockaddr *)&channel,sizeof(channel));
    if(b<0)
    {
        printf("bind error");
        exit(0);
    }
    listen(s,5);
    while(1)
    {
        printf("waiting for request\n");
        sa=accept(s,0,0);
        if(sa<0)
        {
            printf("accept failure");
        }
        for (i=1; i<=56; i++)               //for 10 sec >> 56
        {   
            for(j=1;j<=20;j++)
            {

            //more than 100 lines of code here
            }               
            average=(sum/20)*1.22;
            send(sa, &average, sizeof(average), 0);

            //int tmp = htonl((uint32_t)average); //tried this also
            //send(sa, &tmp, sizeof(tmp), 0);

            // int n = write(sa, &average, sizeof(average)) //and tried this also
            // if(n<0){
            // printf("error");}

            printf("%lld \n", average);
            srno++; 
            sum=0;
            average=0;      
        }
    }
    remove_gpio();  
    close(s);
    return 0;
}

但我无法在 Qt 客户端中显示数据,这让我发疯。在我的 QtextEdit 中,无论我尝试什么,我都会得到非 ASCII 字符。在我的 startRead() 里面我做了

...

QByteArray Data = socket->readAll();

ui->textEdit->append(QString(Data));

...

我也尝试过使用其他方法bytesavailable() canreadLine(),也通过了其他链接但不成功。

我每次都会得到非 ASCII 疯狂字符。抱歉,由于代表人数少,无法提供图片。 我需要有关通过套接字发送双重数据的帮助,并且能够处理数据或至少在 QTextEdit/QPlainTextEdit 中显示它们。

谢谢。

【问题讨论】:

  • 代码缺少右大括号}。而且格式不太好。
  • 抱歉,我在复制时遗漏了几个大括号。但是服务器代码确实有效。我似乎无法通过套接字在客户端获取双重数据。
  • 标题不需要加“已解决”,当你接受答案时,带有赞成票的图标会改变
  • 你加的牙套好像放错地方了,至少掉了一个!

标签: c++ qt sockets


【解决方案1】:

正如 ciphor 所说,您正在尝试将二进制文件直接显示为文本

您需要使用数据流进行转换

QByteArray Data = socket->readAll();
QDataStream dstream (Data);
double d;
while(!dstream.atEnd())
{
    dstream >> d;
    ui->textEdit->append(QString::number(d));
}

【讨论】:

    【解决方案2】:

    您需要实际设计、指定和实现一个协议。否则,就好像您的客户端在说中文而您的服务器在听西班牙语一样。由于 TCP 是字节流协议,因此您需要精确指定两个程序如何将数据作为字节流进行交换。然后设计双方发送符合规范的字节流和接收符合规范的字节流。为了帮助您入门,您应该彻底研究现有的 TCP 上层协议的规范,例如 IRC、NNTP、SMTP、IMAP 等。

    【讨论】:

      【解决方案3】:

      double 的转换说明符是 "lf"

      代码使用的"lld" 用于long long integer

      所以使用:

      printf("%lf\n", average);
      

      【讨论】:

      • 是的,似乎可以在 XTerminal 上显示数据,但我仍然没有通过套接字获取 QTextEdit 上的数据。
      • 查看这个关于如何将双精度数转换为字符串的问题的答案:stackoverflow.com/q/332111/694576
      【解决方案4】:

      您正在以双精度二进制格式发送数据,但试图在您的客户端显示为字符串,这是非 ASCII 的原因。

      如果你想发送ASCII,你应该在服务器端发送之前将数据转换为字符串格式。

      char buf[20] = {0};
      average=(sum/20)*1.22;
      sprintf(buf, "%lld", average);
      send(sa, &buf[0], strlen(buf), 0);
      

      【讨论】:

      • 你能用几行代码指出我正确的方向吗?似乎没有任何效果。我也试过 htons()。
      • 传输二进制数据完全没问题,因为长字节序不是问题,并且发送方和接收方都知道发送了什么样的数据。这里double 应该没问题。
      • 如何将双精度数据转换为字符串并写入套接字?
      • 使用"lld" 打印双精度很好!
      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2019-01-01
      • 2011-01-05
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      相关资源
      最近更新 更多