我正在尝试通过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;
}
答案 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)
事实证明我的问题来自之前发送的数据。发送的大小和收到的大小不同,因此整个阵列搞砸了。谢谢大家的建议,不敢相信我没有早点赶上...