将char转换为int(用于套接字)

时间:2011-07-29 06:40:26

标签: c sockets

我可能从y'day开始两次问过这个问题,但我仍然没有得到一个好的答案。我的问题是我的IP地址存储在unsigned char中。现在我想通过套接字从客户端发送到服务器的IP地址。人们建议我使用htonl()ntohl()进行网络字节传输,但我无法理解htonl()ntohl()的参数是整数...如何我可以在unsigned char ??的情况下使用它吗?如果我不能使用它,我怎样才能确保如果我在缓冲区中发送130.191.166.230,接收器将始终收到相同的信息?任何意见或指导将不胜感激。提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果你有一个unsigned char array 字符串(沿着"10.0.0.7"的行)形成IP地址(我假设你这样做,因为很少有32位{ {1}}周围的系统,使得将IP地址存储到单个字符中相当困难),您可以直接发送它并让另一端使用它(假设您当然以相同的方式编码字符,例如用ASCII)。


另一方面,您可能有一个包含二进制IP地址的四字节字符数组(假设字符为8位)。

使用charhtonl是为了确保此二进制数据按照big-endian和little-endian系统都能理解的顺序发送。

为此,网络字节顺序(线上字节的顺序)是big-endian,因此这些函数在big-endian系统上基本上什么都不做。在little-endian系统上,他们交换字节。

换句话说,您可能拥有以下二进制数据:

ntohl

在big endian布局中,将以uint32_t ipaddress = 0x0a010203; // for 10.1.2.3 的形式存储为小0x0a,0x01,0x02,0x03

所以,如果你想以网络字节顺序发送它(任何endian系统都能理解),你就不能这样做:

0x03,0x02,0x01,0x0a

因为从小端系统向大端系统发送它将最终反转字节。

您需要做的是:

write (fd, &ipaddress, 4);

这迫使它成为网络字节顺序,而另一端的任何程序都可以理解(假设它使用uint32_t ipaddress = 0x0a010203; // for 10.1.2.3 uint32_t ip_netorder = htonl (ipaddress); // change if necessary. write (fd, &ip_netorder, 4); 来确保它的目的是正确的。)

事实上,这个方案可以处理的不仅仅是大端和小端。如果你有一个32位整数编码方案,其中ntohl(四个字节)被编码为ABCD,或者甚至你有一个奇怪的混合形成你的整数(比如先使用偶数位然后使用奇数位) ),这仍然有效,因为您的本地A,D,B,Chtonl知道这些格式,并且可以正确地将它们转换为网络字节顺序。

答案 1 :(得分:0)

字符数组具有已定义的顺序,并且不依赖于字节序 - 它们总是按照惯例从低地址到高地址运行。

你有一个字符串或4个字节吗?

答案 2 :(得分:0)

IP4地址是4个字节(也就是字符)。所以你将在一个数组中有4个无符号字符。将该数组转换为发送它。

e.g。 unsigned char IP [4];

使用((char *)IP)作为数据缓冲区发送,并从中发送4个字节。