序列化和反序列化套接字中的结构
serialize and deserialize structures in sockets
我有一个Struct通过套接字发送到客户端。客户端和服务器都在同一个体系结构上,所以不存在端到端问题。我正确地接收了int值。但不能正确接收char[]值。这就是结构。
struct Packet {
int id;
int number;
char data[256];
};
在服务器端,我序列化数据并写入客户端。
struct Packet *s = new Packet();
s->id= htonl(1000);
s->number= htonl(7788);
memcpy(s->data, "MESSAGE", 7);
n = write(NewSockFD , s ,sizeof(s) );
在客户端,我反序列化数据。
n = read(SockFD , Buffer , sizeof(Buffer));
struct Packet *s = (struct Packet*)Buffer;
char b[256];
int i = ntohl(s->id);
int j = ntohl(s->number);
memcpy(b, s->data, sizeof(s));
我正确地接收到id和number值。问题在于数据值。我做错了什么??
在代码中,您使用sizeof(s)
。这是Packet*
的大小,而不是Packet
。将其替换为sizeof(*s)
以获得正确的尺寸
此外,由于data
的值没有全部初始化,因此从它读取会导致未定义行为。您需要以某种方式初始化所有元素(最短的方法是在struct定义中执行char data[256] { };
)。
因为这是c++,你不需要说struct Packet
,你可以只说Packet
,除非你也有一个名为Packet
的函数。但是它只出现在你的代码中一半的时间,这意味着你不需要,所以你可以把它删掉。
正如Chris G所提到的,在你解决了这个问题之后,你有另一个问题,那就是你将整个Packet
复制到char[]
中,而Packet
的data
只足够大。把
memcpy(b, s->data, sizeof(s))
memcpy(b, s->data, sizeof(s->data))
并且要意识到,如果发送方没有为您这样做(您可能希望采取预防措施),则此data
可能不会以空终止。
相关文章:
- WTSEnumerateProcesses与套接字和数据结构
- 在 UDP 套接字上发送结构、浮点数和 int C++
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- 通过 TCP 套接字发送结构 C++
- C++:无法使套接字、螺纹和结构工作
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 套接字编程:结构 sockaddr VS 结构sockaddr_in
- 如何使用套接字构建健壮的网络体系结构
- C++套接字服务器体系结构
- 如何序列化一个8位整数的结构用于套接字编程
- 通过std::asio-tcp套接字发送结构
- 从 Linux 中的管道/套接字读取所有结构或什么都没有
- C++ 套接字:结构地址的大小
- 分段错误通过 TCP 套接字发送结构
- 通过套接字发送结构并接收中文字母
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 我通过函数SENDTO通过套接字(c++)发送结构,并通过RECVFORM接收,但总是得到一些垃圾值
- 从LISP的套接字中读取c++结构
- 如何通过套接字发送结构
- 如何通过套接字发送与c++兼容的Java结构体