0

我正在尝试通过 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;
}
4

3 回答 3

3

从几件事开始;

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

2)long不保证连接两端的大小相同,通常是 32 位或 64 位。htonl返回uint32_t始终为 32 位,并且您的传输/接收数组也应使用该类型以独立于体系结构。

于 2012-10-19T07:22:59.403 回答
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 不会像这样插入任何数据。您需要检查没有其他内容被写入您的传出套接字,并且您正在从正确的传入套接字读取。

于 2012-10-19T16:12:53.617 回答
0

原来我的问题来自之前发送的数据。发送的大小和接收的大小不同,因此整个数组搞砸了。谢谢大家的建议,不敢相信我没有早点发现...

于 2012-10-22T00:31:39.017 回答