发送整数数组(winsock)

时间:2014-05-04 00:13:44

标签: c++ winsock2

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

还有其他功能允许我这样做吗?我查看了微软网站上的参考资料,但我没有得到其他功能。

如果还有其他功能,我希望你能告诉我如何或给我提示,或者是否有另一种方法可以做到这一点。

注意:我使用Borland 6

在Windows 8下使用C ++

3 个答案:

答案 0 :(得分:2)

好doodleboodle,猜猜看,如果你阅读TCP RFC,你可能会认为TCP协议只传输OCTET STREAMS,如果你需要传输比一个字节更复杂的东西,你需要一个TCP之上的协议它定义了您的应用程序协议单元消息类型。

答案 1 :(得分:2)

这可能很难解释。

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

首先,如果您的数据打算通过网络传输,则必须假设目标端点字节序可能与传输端点不同。

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

由于必须处理已知的数据大小,而不是将数组声明为int [],所以应该通过stdint.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()。

希望这能为你提供进一步研究的线索。

答案 2 :(得分:1)

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

它使用以字节为单位的二进制数据来发送数据。因此,如果要发送复杂的结构/对象,则需要先将其序列化为字节数组。

在整数的情况下,它非常简单:只需将整数数组转换为字节数组即可。 (尽管跟踪长度)。

当然,在TCP层上构建抽象层更合适,因此发送/接收不同类型的数据更容易。