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

时间:2016-10-28 14:37:07

标签: 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 / htons ntohl / ntosl )。有人有一个关于如何实现它的例子,例如,在这段代码中吗?

2 个答案:

答案 0 :(得分:1)

你写的不正确。我假设您打算构建一个包含该顺序的无符号字符缓冲区:

  • int值12345
  • 的表示的两个最低字节
  • 包含char值-1
  • 表示的字节
  • 包含长值表示的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;

注意:当您通过首先发送最低字节来明确处理字节序时,可以在使用不同字节序的机器上使用它

答案 1 :(得分:0)

在接收方,你应该按相反的顺序思考

a += array[1];
a<<=8;
a += (array[0]);

但请注意,左移符号值是UB,正如标准所说

  

<强> 6.5.7.4

     

E1的结果&lt;&lt; E2是E1左移E2位位置;腾出的位充满了       零。如果E1具有无符号类型,则结果的值为E1×2E2,模数减少       比结果类型中可表示的最大值多一个。 如果E1已签名       类型和非负值,E1×2E2在结果类型中可表示,那就是       结果价值;否则,行为未定义。