通过套接字从C服务器向qt客户端发送数据

时间:2013-12-09 12:08:17

标签: c++ qt sockets

我在这里遇到了一些问题:

我有一个简单的C服务器(不能使用Qt TcpServer,嵌入式主板的限制),使用 send()<通过tcpsocket发送数据(由GPIO端口生成) / strong>即可。如果我有一个简单的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-&gt; readAll();

     

UI-&GT; textEdit-&GT;附加(QString的(数据));

     

...

我也尝试过使用其他方法 bytesavailable()canreadLine(),并且还通过其他链接但是没有成功。

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

感谢。

4 个答案:

答案 0 :(得分:3)

正如ciphor所说,你试图将二进制文件直接显示为文本

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

double的转化说明符为"lf"

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

所以使用:

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

答案 3 :(得分:0)

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

如果要发送ASCII,则应在将数据发送到服务器端之前将其转换为字符串格式。

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