gpt4 book ai didi

c - 套接字编程中的 htons() 函数

转载 作者:太空狗 更新时间:2023-10-29 16:20:09 25 4
gpt4 key购买 nike

我是套接字编程的新手,我想了解 htons() 的操作.我在 Internet 上阅读了一些教程,例如 thisthis例如一个。但我不明白什么是htons()确实如此。我尝试了以下代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main( int argc, char *argv[] )
{
int sockfd, newsockfd, portno, clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;

/* First call to socket() function */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("ERROR opening socket");
exit(1);
}
/* Initialize socket structure */
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 5001;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

/* Now bind the host address using bind() call.*/
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
{
perror("ERROR on binding");
exit(1);
}

/* Now start listening for the clients, here process will
* go in sleep mode and will wait for the incoming connection
*/
listen(sockfd,5);
clilen = sizeof(cli_addr);

/* Accept actual connection from the client */
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr,
&clilen);
if (newsockfd < 0)
{
perror("ERROR on accept");
exit(1);
}
/* If connection is established then start communicating */
bzero(buffer,256);
n = read( newsockfd,buffer,255 );
if (n < 0)
{
perror("ERROR reading from socket");
exit(1);
}
printf("Here is the message: %s\n",buffer);

/* Write a response to the client */
n = write(newsockfd,"I got your message",18);
if (n < 0)
{
perror("ERROR writing to socket");
exit(1);
}
return 0;
}

sin_port 的值显示为 35091在调试时,我不明白如何 portno5001 更改为至 35091 .有人可以解释值(value)变化的原因吗?

最佳答案

它与字节在内存中的存储顺序有关。十进制数5001是十六进制的0x1389,所以涉及的字节是0x130x89。许多设备以 little-endian 格式存储数字,这意味着最低有效字节在前。因此,在这个特定示例中,这意味着在内存中,数字 5001 将存储为

0x89 0x13

htons() 函数确保数字以网络字节顺序存储在内存中,即最高有效字节在前。因此它将交换构成数字的字节,以便在内存中字节将按顺序存储

0x13 0x89

little-endian 机器上,交换字节数的十六进制形式为 0x8913,十进制形式为 35091。请注意,如果您在 big-endian 机器上工作,htons() 函数将不需要进行任何交换,因为数字已经以正确的方式存储在内存中。

所有这些交换的根本原因与正在使用的网络协议(protocol)有关,这些协议(protocol)要求传输的数据包使用网络字节顺序。

关于c - 套接字编程中的 htons() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19207745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com