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

正如我在上一个问题( 如何在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); 

但这也不起作用(read函数返回-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构造sizeof (long) * ARRAY_LEN

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

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

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

它包含来自TCP的所有流包装器,一直到HTTP甚至SOAP,代码非常小,尽管模板很严重…