繁体   English   中英

为什么从 TCP 套接字读取整数数组时会得到奇怪的结果?

[英]Why do I get weird results when reading an array of integers from a TCP socket?

正如我在上一个问题的回答中所建议的那样( 如何在 C 中通过 TCP 发送一个整数数组? ),我试图发送一个 long int 数组,但是我可能正在做一些事情来破坏解决方案......

#define ARRAY_LEN 4

/* I'm using long because the numbers are very large,
 * but in this example they're small to save space. */
long originalArray[ARRAY_LEN] = { 1, 2, 3, 4 };

myObject.SetMyArray(originalArray);

// NOTE: The following is in a different function.

long *myArrayFromFunction = myObject.GetMyArray();

write(clientSocketFD, myArrayFromFunction, sizeof(myArrayFromFunction) * ARRAY_LEN);

转换为指针然后传递不正确吗?

在客户端阅读时,我收到的不是我发送的数字(1、2、3、4),而是长数字,例如 140088443806649...

#define ARRAY_LEN 4

long targetArray[ARRAY_LEN];
read(socketFD, targetArray, sizeof(targetArray) * ARRAY_LEN);

所以,假设我需要读入一个指针,我试过这个......

#define ARRAY_LEN 4

long *targetArray;
read(socketFD, targetArray, sizeof(targetArray) * ARRAY_LEN);

但这也不起作用(读取 function 返回 -1)。

额外的指针是不必要的。 数组(基本上是一个指针)可以直接传递。 您错误地使用了指针的大小而不是数据类型的大小(长); 改用sizeof (long) * ARRAY_LENsizeof (originalArray)

写:

#define ARRAY_LEN 4
long originalArray[ARRAY_LEN] = { 1, 2, 3, 4 };
write(clientSocketFD, originalArray, sizeof (originalArray));

读:

#define ARRAY_LEN 4
long targetArray[ARRAY_LEN];
read(socketFD, targetArray, sizeof (targetArray));

如果您将数组作为指针传递,则sizeof不能用于获取数组的总大小。 在这种情况下,大小必须与指针以及使用sizeof (long) * ARRAY_LEN构造的大小一起传递。

小心使用 long 这样的类型,因为它在不同平台上的大小并不总是相同(即 32 位与 64 位); 更喜欢像int32_t这样的大小类型。 此外,您也可能遇到字节序问题。 考虑在写入之前使用htonl对值进行字节交换。

我还想指出,在某些情况下,存储在 memory 中的数据和通过网络发送的数据的不同字节序可能是问题的原因,因此如果您在低级别工作,请务必检查这一点。

如果您正在编写自己的 TCPStream 或其他内容,您可能想查看http://smartwinlib.org中的 SmartNetwork 代码...

It contains stream wrappers for all from TCP and all the way up to HTTP and even SOAP and the code is extremely small, though heavily templated...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM