我对 C 编程还比较陌生,还没有找到答案。 我想通过 TCP 连接正确发送和接收整数、字符和长整数。 我已经构建了这个,但它还没有用。
发件人:
int a = 12345;
char b = -1;
unsigned long c = 12174723939;
unsigned char array[256];
array[0] = (a >> 0) & 0xFF;
array[1] = (a >> 8) & 0xFF;
array[2] = (b >> 16) & 0xFF; //Is this correct for -1?
array[3] = (c >> 24) & 0xFF;
array[4] = (c >> 32) & 0xFF;
array[5] = (c >> 40) & 0xFF;
array[6] = (c >> 48) & 0xFF;
send(socket, array, sizeof(array),0); //or is &array better?
接收方:
int a;
char b;
unsigned long c;
unsigned char array[256];
recv(socket, array, sizeof(array),0);
a |= (array[0] << 0) & 0xFF;
a |= (array[1] << 8) & 0xFF;
b |= (array[2] << 16) & 0xFF;
c |= (array[3] << 24) & 0xFF;
c |= (array[4] << 32) & 0xFF;
c |= (array[5] << 40) & 0xFF;
c |= (array[6] << 48) & 0xFF;
这是正确的吗?什么不见了?还有其他解决办法吗?
接收部分是怎么做到的?我读过大端和小端(使用 htonl/htons 和 ntohl/ntosl)。有人有关于如何实现它的示例吗?例如,在此代码中?
最佳答案
你写的不对。我假设您打算构建一个包含以下顺序的无符号字符缓冲区:
- int值12345表示的最低两个字节
- 包含 char 值 -1 表示的字节
- 包含 long 值表示的最低 4 个字节 12174723939
你应该写:
array[0] = (a >> 0) & 0xFF; // lowest byte
array[1] = (a >> 8) & 0xFF; // next
array[2] = b; // cast a char to an unsigned char
array[3] = (c >> 0) & 0xFF; // lowest byte of c
array[4] = (c >> 8) & 0xFF;
array[5] = (c >> 16) & 0xFF;
array[6] = (c >> 24) & 0xFF;
而且你不应该发送整个缓冲区,而只发送有趣的部分:7 个字节:
send(socket, array, 7, 0);
在接收器部分,您从它们的字节重建值:
a = array[0]; // start with an initial value
a |= array[1] >> 8;
b = array[2]; // is already a single byte
c = array[3];
c |= array[4] >> 8;
c |= array[5] >> 16;
c |= array[6] >> 24;
注意:由于您通过首先发送最低字节来明确处理字节顺序,因此可以跨使用不同字节顺序的机器使用
关于c - 在 C 中通过 TCP/IP 发送和接收字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40307471/