2013-12-09 76 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等。

相關問題