2013-12-09 123 views
0

我在的问题的情况在这里位:由C服务器发送数据在套接字QT客户

我有一个简单的C服务器(不能使用Qt TCPSERVER,嵌入式主板的限制),这将使用send()通过tcpsocket双重数据(由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数据=插座 - > readAll();

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

...

我也尝试使用其他方法参考bytesAvailable()canreadLine(),并且还可以通过其他环节去,但没有成功。

非ASCII的疯狂字符是我每次得到的。对不起,由于低代表无法提供照片。 我需要关于通过套接字发送双重数据并且能够使用数据或至少在QTextEdit/QPlainTextEdit中显示它们的帮助。

谢谢。

+1

代码忽略了大括号'}'。而且格式不太好。 – alk

+0

对不起,我在复制时错过了一些大括号。但服务器代码确实有效。虽然我似乎无法通过套接字在客户端获得双重数据。 – rNov

+1

无需在标题中添加“已解决”,当您接受答案时,带有upvotes的图标会发生变化 –

回答

0

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

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

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

你能用几行代码指出我的方向吗?似乎没有任何工作。我也试过htons()。 – rNov

+1

传输二进制数据是完全正确的,因为长字节序不是问题,发送方和接收方都知道发送了什么类型的数据。这里'双'应该没问题。 – alk

+0

如何将双数据转换为字符串并写入套接字? – rNov

1

转换说明符double"lf"

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

所以使用:

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

似乎在XTerminal上显示数据,但我仍然没有通过套接字获取QTextEdit上的数据。 – rNov

+1

有关如何将double转换为字符串,请参阅此查询的答案:http://stackoverflow.com/q/332111/694576 – alk

3

为ciphor说你试图直接作为文本显示二进制

你需要使用一个数据流转换

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

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

相关问题