c - 在 C 中通过 TCP/IP 发送和接收字节数组

标签 c arrays sockets tcp byte

我对 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/htonsntohl/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/

相关文章:

python - 二维 NumPy 数组中每个元素的计数

c - (如何)我可以从套接字描述符中找到套接字类型吗?

c - 程序集与 C 可执行文件大小

c++ - 为什么 C 程序员使用 typedef 来重命名基本类型?

比较 C 中两个字符串的排列

C# SocketAsyncEventArgs 处理接收和发送数据

Java - 分布式应用程序中的观察者/可观察者?

c - 简单C程序逻辑错误+指针误解

java - 在jsp中迭代和打印带有嵌套数组的HashMap的内容

jquery - 将数组传递给 typeahead Bootstrap