问题描述
我正在尝试使用unix套接字来测试向本地主机发送一些udp数据包.
I am trying to use unix sockets to test sending some udp packets to localhost.
据我了解,在设置ip地址和端口以发送数据包时,我会用转换为网络字节顺序的值填充sockaddr_in
.我在OSX上,对此感到惊讶
It is my understanding that when setting ip address and port in order to send packets, I would fill my sockaddr_in
with values converted to network-byte order.I am on OSX and I'm astonished that this
printf("ntohl: %d\n", ntohl(4711));
printf("htonl: %d\n", htonl(4711));
printf("plain: %d\n", 4711);
打印
ntohl: 1729232896
htonl: 1729232896
plain: 4711
因此,两个函数均未实际返回纯值.我本来希望看到结果有所不同,因为x86是little-endian(afaik),或者与实际数字4711相同且相同.显然,我不明白htonl
和ntohl
及其变体的作用.我想念什么?
So neither function actually returns the plain value. I would have expected to see either the results differ, as x86 is little-endian (afaik), or be identical and the same as the actual number 4711. Clearly I do not understand what htonl
and ntohl
and their variants do. What am I missing?
相关代码是这样:
int main(int argc, char *argv[])
{
if (argc != 4)
{
fprintf(stderr, "%s\n", HELP);
exit(-1);
}
in_addr_t rec_addr = inet_addr(argv[1]); // first arg is '127.0.0.1'
in_port_t rec_port = atoi(argv[2]); // second arg is port number
printf("Address is %s\nPort is %d\n", argv[1], rec_port);
char* inpath = argv[3];
char* file_buf;
unsigned long file_size = readFile(inpath, &file_buf); // I am trying to send a file
if (file_size > 0)
{
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = rec_addr; // here I would use htons
dest.sin_port = rec_port;
printf("ntohs: %d\n", ntohl(4711));
printf("htons: %d\n", htonl(4711));
printf("plain: %d\n", 4711);
int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (socket_fd != -1)
{
int error;
error = sendto(socket_fd, file_buf, file_size + 1, 0, (struct sockaddr*)&dest, sizeof(dest));
if (error == -1)
fprintf(stderr, "%s\n", strerror(errno));
else printf("Sent %d bytes.\n", error);
}
}
free(file_buf);
return 0;
}
推荐答案
两个函数都反转字节的顺序.为什么那会返回参数本身?
Both functions reverse the bytes' order. Why would that return the argument itself?
尝试htons(ntohs(4711))
和ntohs(htons(4711))
.
这篇关于了解htonl()和ntohl()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!