当从TCP套接字读取整数数组时,为什么会出现奇怪的结果?

时间:2009-03-23 15:20:13

标签: c sockets tcp

正如我在上一个问题(How do I send an array of integers over TCP in C?)的答案中所建议的,我试图发送一个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);

但这也不起作用(read函数返回-1)。

3 个答案:

答案 0 :(得分:4)

额外的指针是不必要的。数组(基本上是一个指针)可以直接传递。您错误地使用指针的大小而不是数据类型的大小(长);使用sizeof (long) * ARRAY_LEN或仅使用sizeof (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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

它包含来自TCP的所有流包装器,一直到HTTP甚至SOAP,并且代码小,虽然模糊不清......