2016-02-03 44 views
0

我想從嵌入式設備的特定TCP端口讀取數據,然後將其發送到服務器。因此,我的整個設備都有一個連接到電路板的傳感器,例如,傳感器會在TCP端口6000上發送一些數據。我的代碼看起來像從嵌入式設備的TCP端口讀取數據

// create socket 
int sockrd = socket(AF_INET, SOCK_STREAM,0); 

if(sockrd < 0) 
{ 
    std::cout<<"Can't create socket\n"<<std::endl; 
    exit(1); 
} 

// Name and bind socket 
struct sockaddr_in addressrd; 
addressrd.sin_family = AF_INET; 
addressrd.sin_addr.s_addr = inet_addr("127.0.0.1");//Provide ip of the board 
addressrd.sin_port=htons(6000); // TCP port of the board 

bind(sockrd,(struct sockaddr*)&addressrd, sizeof(addressrd)); 

if(bind < 0) 
{ 
    std::cout<<"Can't bind properly\n"<<std::endl; 
} 

// declare a buffer to read from the tcp port of the device 
char buffer[1024]; 
read(sockrd,&buffer,sizeof(buffer)); 
close(sockrd); 

我不必擔心服務器進程。我很難理解如何僅對嵌入式設備進行操作,這意味着只有我的嵌入式設備才能從各自的tcp端口讀取數據,然後將其發送到服務器。我的代碼將在嵌入了Linux內核的主板上的處理器上運行。

+1

顯示你的代碼並解釋它做了什麼,不做什麼。如果您沒有任何代碼,請先閱讀教程。 – CodeCaster

回答

0

您正試圖從未連接的端口讀取數據。它會失敗。您需要:

  • connect()同行,在這種情況下,你不需要bind(),或
  • listen()在港口和accept()從對端的連接

這是正確的取決於設備。目前你沒有做。

當前bind()調用綁定到127.0.0.1將阻止所有與外部的連接,如果您是客戶端,應該將其刪除,或者如果您是服務器,則應將其更改爲綁定到INADDR_ANY。

您還需要爲您的read()調用添加錯誤檢查,並修復其他錯誤檢查,以便他們調用perror()或朋友,這樣您就可以獲得實際的失敗模式,而不是您自己設計的一些無用的消息。

+0

我希望我的主板充當客戶端(它讀取其tcp端口上的數據,然後將其發送到服務器)。我只有在理解如何從設備本身讀取數據時遇到問題。由於代碼將在開發後在處理器上運行。所以,假設我的嵌入式設備有幾個傳感器連接在一塊板上,並在TCP端口6000上發送數據,我需要讀取這些數據,然後將它們連接到服務器。你提到的部分是客戶端服務器模型的通用,我很明白。 – user1882840

+0

你可能會理解它,但你還沒有實現它。您正在讀取未連接的套接字。它會失敗。如果電路板是客戶端,則它必須連接到服務器。但是我認爲你從你的描述中漏掉了一些東西。在我看來,你的代碼也是一個到服務器的TCP服務器,所以你必須接受來自電路板的連接。否則它是董事會的客戶,你必須連接到它。無論如何,你必須做一個或另一個。 – EJP

+0

是的你是對的。所以,我現在正在考慮這種情況:我將在主板上運行客戶端程序以及服務器程序。服務器程序將綁定到端口號爲6000的板子的IP上。我的客戶端程序將從服務器接收數據。我面臨的問題是如何將端口6000上收到的數據發送到另一臺服務器?我想我需要在兩個客戶端之間的共享隊列。我對嗎 ? – user1882840