通过套接字将空字节从Linux发送到Windows机器 - 它是否相同

时间:2016-01-06 00:09:32

标签: c++ linux windows sockets

这是基于我问过的早期question。目前我通过socket

从linux机器向linux发送一个零位八位字节
const char null_data(0);
send(newsockfd,&null_data,1,0);

我的问题是,当发送到Windows机器(64位)时这是一样的吗? 或者我必须更改代码吗?

2 个答案:

答案 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。如果您考虑浮点数据更糟糕,因为标准未指定编码。