通过TCP发送一组数字

时间:2012-10-19 07:13:06

标签: arrays tcp numbers

我正在尝试通过TCP套接字发送一组数字,但它们的输出不正确。我无法弄清楚为什么它没有收到正确的数字。这就是我的......

客户端

// the number array to be sent
unsigned long numArray[10] = { htonl(1), htonl(2), htonl(3), htonl(4), htonl(5), 
                               htonl(6), htonl(7), htonl(8), htonl(9), htonl(10) };
send(s, &numArray[0], sizeof(numArray), 0);

服务器

// get the array of numbers
unsigned long numberArray[10];
int numberData = recv(new_fd, numberArray, sizeof(numberArray), 0);
if(numberData == -1) {
  cout << "ERROR" << endl;
}
unsigned long* num = numberArray;
for(int i = 0; i < sizeOfIncomingData; i++) {
  // this outputs a bunch of huge numbers, none of which are right...
  cout << ntohl(*(num+i)) << endl;
}

3 个答案:

答案 0 :(得分:3)

开始时的一些事情;

1)您没有检查send()recv()的不完整读取或写入的返回值,它们可能不会发送或接收您给它们的实际字节数,它们返回实际发送/接收的数量的值。

2)long不保证连接两侧的大小相同,通常为32位或64位。 htonl返回uint32_t,它始终为32位,您传输/接收的数组也应使用该类型,以便与架构无关。

答案 1 :(得分:0)

转换为十六进制的数字为:

10 0A 40 00
06 00 00 00
40 10 40 00
0A 15 60 00
10 0A 40 00
28 60 A3 4F
C0 11 60 00

这些不是你的数字,而是某种数据流。 10是DLE,0A是换行符,40是“@”。以后的数据也不是你的数字。

TCP不会插入任何这样的数据。您需要检查没有其他内容正在写入您的传出套接字,并且您正在从正确的传入套接字读取。

答案 2 :(得分:0)

事实证明我的问题来自之前发送的数据。发送的大小和收到的大小不同,因此整个阵列搞砸了。谢谢大家的建议,不敢相信我没有早点赶上...

相关问题