2016-12-09 38 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'。 –