2016-12-09 71 views
0

我想通過套接字發送單個字符。在接收端,它總是以空字符結尾。有什麼建議麼?C++單個字符未通過套接字發送

發送部分

char message[7]; 
in_addr addr; 
inet_aton(splitter_socket_.local_endpoint().address().to_string().c_str(), &addr); 
(*(in_addr *)&message) = addr; 
(*(uint16_t *)(message + 4)) = htons(splitter_socket_.local_endpoint().port()); 
(*(char *)(message+6))=htons('M'); 
splitter_socket_.send(boost::asio::buffer(message)); 

接收

boost::array<char, 7> buf; 
char *raw_data = buf.data(); 
boost::asio::ip::address ip_addr; 
int port; 

read((*serve_socket), boost::asio::buffer(buf)); 
in_addr ip_raw = *(in_addr *)(raw_data); 
ip_addr = boost::asio::ip::address::from_string(inet_ntoa(ip_raw)); 
port = ntohs(*(short *)(raw_data + 4)); 
char sig = ntohs(*(char *)(raw_data+6)); 

這總會被執行的一部分。意思是,sig總是一個空字符 但是我發送了'M'。這是缺少的。

if(sig==0){ 
    number_of_monitors_++; 
    TRACE("The number of monitors increased to "<<number_of_monitors_); 
} 

我送被正確

+0

我不知道ASIO,但我知道它是異步的。你確定ASIO在你從調用'send'的函數返回後沒有使用緩衝區嗎? –

回答

4

你的「M」做htons接收到的數據的其餘部分。

這就是將'M'擴展爲short,然後(因爲你顯然是在一個little-endian機器上)對它進行字節交換,所以你發送的是高位字節,擴展版本,這將是一個0,因爲'M'保證是積極的。

A char不是short,所以它不應該被視爲一個。按原樣傳輸char

+0

Arent字符長度爲1個字節? – Rakshith

+0

@Rakshith:是的,但是一個短的長度是2個字節。 'htons'以一個short參數作爲參數並返回一個short,所以當你調用'htons'時你的char被提升爲'short'。 –