C ++单个字符不通过套接字发送

时间:2016-12-09 17:49:13

标签: c++ sockets boost

我想在套接字上发送一个字符。在接收端,它总是以空字符结尾。有什么建议吗?

发送部分

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&#39;。那是不见了。

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

我发送的其余数据正在正确接收

1 个答案:

答案 0 :(得分:4)

你在&#39; M&#39;上做htons

即将签署的“M&#39; M&#39;然后(因为你显然是在小端机器上)进行字节交换,所以你发送的是符号扩展版本的高位字节,它将是{{ 1}},因为&#39; M&#39;保证是积极的。

0不是char,因此不应将其视为一个。只需按原样发送short