当前位置:  开发笔记 > 编程语言 > 正文

通过TCP发送int数组时,为什么只有第一个数量正确?

如何解决《通过TCP发送int数组时,为什么只有第一个数量正确?》经验,为你挑选了2个好方法。

按照我之前的问题(为什么从TCP套接字读取整数数组时会得到奇怪的结果?),我提出了以下代码,这似乎有用.代码示例适用于少量数组元素,但一旦变大,数据就会在最后被破坏.

这是通过TCP发送int数组的代码:

#define ARRAY_LEN 262144

long *sourceArrayPointer = getSourceArray();

long sourceArray[ARRAY_LEN];
for (int i = 0; i < ARRAY_LEN; i++)
{
    sourceArray[i] = sourceArrayPointer[i];
}

int result = send(clientSocketFD, sourceArray, sizeof(long) * ARRAY_LEN);

这是接收int数组的代码:

#define ARRAY_LEN 262144

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

前几个数字很好,但在数组的下方,数字开始变得完全不同.最后,当数字看起来像这样:

0
0
0
0
0
0
0
0
0
0

但他们实际上是这样出来的?

4310701
0
-12288
32767
-1
-1
10
0
-12288
32767

这是因为我使用了错误的发送/接收大小?



1> sth..:

调用read(..., len)len从套接字读取字节,它读取最大len字节数.您的阵列相当大,它将被拆分为许多TCP/IP数据包,因此您的read调用可能只返回数组的一部分,而其余部分仍在"传输中".read()返回它收到的字节数,所以你应该再次调用它,直到你收到你想要的一切.你可以这样做:

long targetArray[ARRAY_LEN];

char *buffer = (char*)targetArray;
size_t remaining = sizeof(long) * ARRAY_LEN;
while (remaining) {
  ssize_t recvd = read(socketFD, buffer, remaining);
  // TODO: check for read errors etc here...
  remaining -= recvd;
  buffer += recvd;
}



2> dirkgently..:

以下是否可以?

for (int i = 0; sourceArrayPointer < i; i++)

您正在比较苹果和橙子(读指针和整数).由于指向longs 数组的指针> 0(最常见),因此不会执行此循环.因此,在接收端,您正在读取一个单元化数组,这会导致传递那些不正确的数字).

它宁愿是:

for (int i = 0; i < ARRAY_LEN; i++)

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有