这是基于我问过的早期question。目前我通过socket
从linux机器向linux发送一个零位八位字节const char null_data(0);
send(newsockfd,&null_data,1,0);
我的问题是,当发送到Windows机器(64位)时这是一样的吗? 或者我必须更改代码吗?
答案 0 :(得分:0)
这里的技巧是尽可能使用uint*_t
数据类型:
#include <cstdint>
/* ... */
#if !defined(__WIN64)
// *nix variant
typedef int socket_fd_t;
#else
// WinXX socket descriptor data type.
typedef SOCKET socket_fd_t;
#endif
void send_0_byte(socket_fd_t newsockfd)
{
uint8_t zero_byte(0);
send(newsockfd, &zero_byte, 1, 0);
}
您可能希望添加一些错误检查代码,包括正确的平台套接字头。根据定义,uint8_t
是一个8位数量(八位字节),符合您的要求并避免潜在的char
尺寸问题。
在接收方,您希望recv
进入uint8_t
缓冲区。
答案 1 :(得分:-2)
你发送1个字符。 char在标准中定义为1字节大小。幸运的是,在我所知道的所有C ++实现中,字节大小为1 octet(8位),因此您应始终获得相同的结果。
但请注意,标准没有定义字节的大小:
1.7 / 1 C ++内存模型中的基本存储单元是字节。一个 byte至少足以包含basic的任何成员 执行字符集和8位代码单元 Unicode UTF-8编码形式,由一个连续的序列组成 位数,其数量是实现定义的。
这意味着所有发送/接收机器/架构/实现不一定对要发送/接收的八位字节数有相同的理解。例如,如果将来某些实现将例如定义一个由2个八位字节表示的字节(根据标准完全有效,尽管不太可能),理论上你可能会遇到麻烦。
如果你使用更大的整数,真正的问题将会开始,因为你将不得不应对可能不同的endianness。如果您考虑浮点数据更糟糕,因为标准未指定编码。