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

Posted

技术标签:

【中文标题】C ++单个字符未通过套接字发送【英文标题】:C++ Single character not being sent over socket 【发布时间】:2016-12-09 17:49:12 【问题描述】:

我想通过套接字发送单个字符。在接收端,它总是以空字符结束。有什么建议吗?

发送部分

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_);

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

【问题讨论】:

我不知道 ASIO,但我知道它是异步的。从调用send 的函数返回后,您确定ASIO 没有使用缓冲区吗? 【参考方案1】:

你在'M'上做htons

这会将'M'符号扩展为一个短,然后(因为您显然在一个小端机器上)字节交换它,所以您发送的是符号扩展的高字节版本,将是 0,因为 'M' 保证为正数。

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

【讨论】:

非字符 1 字节长? @Rakshith:是的,但是短的长度是 2 个字节。 htons 将 short 作为其参数并返回一个 short,因此当您调用 htons 时,您的 char 将提升为 short

以上是关于C ++单个字符未通过套接字发送的主要内容,如果未能解决你的问题,请参考以下文章

在 Boost ASIO 服务器和 Java 客户端之间通过 TCP 发送双精度

通过cURL / PHP发送时,设备上未收到Firebase通知

发出的值作为一个字符串而不是单个值发送

stm32f3发现usart没有发送

提供的注册令牌未注册

C++ linux套接字,在一次调用中将字符串数组(char**)作为连接字符串发送