发送整数数组(winsock)

Send array of integers (winsock)

本文关键字:winsock 数组 整数      更新时间:2023-10-16

我有一个客户端/服务器程序,我正在编写,我需要使用功能send(SOCKET s, const char *buf, int len, int flags);从客户端发送信息到服务器但显然这个函数是一个字符串,字符数组,但我发送的是加密消息,字符值很大,字符类型不够。

是否有其他函数允许我这样做?我看了微软网站的参考资料,但我没有得到其他功能。

如果有其他的函数,我希望你能告诉我怎么做或给我提示,或者如果有其他的方法,那就去做吧。

注意:我在Windows 8下使用c++,使用Borland 6

这可能很难解释。

你的问题不在于你正在使用的功能,而在于你试图应用的概念。

首先,如果你的数据打算通过网络传输,你必须假设目的端点的端序可能不同于传输端点。

考虑到这一点,建议在传输任何数据之前将符合条件的数据类型转换为网络字节顺序解释。看一下htons(), htonl(), ntohs()和ntohl()函数。

因为你必须处理已知的数据大小,而不是将你的数组声明为int[],你应该通过stint .h类型声明它,如int16_t, int32_t, uint16_t等。

那么,让我们假设您有以下内容:

uint32_t a[4] = { 1, 2, 3, 4 };

如果你想以一种可移植的方式传输这个数组,你应该首先把它的内容转换成网络字节顺序:

uint32_t a_converted[4];
for (int i = 0; i < sizeof(a); i ++)
   a_converted[i] = htonl(a[i]);

现在,如果你想传输这个数组,你可以使用:

send(s, (char *) a_converted, sizeof(a_converted), flags);

请记住,接收该数据的代码应该将其从网络字节顺序转换为主机字节顺序,在本例中,对接收到的每个元素使用ntohl()。

如果你读了TCP RFC,你可能会明白TCP协议只传输OCTET STREAMS,如果你需要传输比一个字节更复杂的东西,你需要一个TCP之上的协议来定义你的应用协议单元消息类型

send(SOCKET s, const char *buf, int len, int flags);基本上是这样做的。

使用以字节为单位的二进制数据发送数据。所以如果你想发送一个复杂的结构/对象,你需要先将它序列化成一个字节数组。

对于整数,这很简单:只需将整数数组转换为字节数组。(但要注意长度)。

当然,在TCP层之上建立一个抽象层更合适,这样更容易发送/接收不同类型的数据。