TCP主机字节序-网络字节序

转换地址格式

inet_ntop()

const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len)
{
const u_char *p = (const u_char*)addrptr;
if (family == AF_INET) {
char temp[INET_ADDRSTRLEN];
snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
if (strlen(temp) >= len) {
errno = ENOSPC;
rturn (NULL);
}
strcpy(strptr, temp);
return (strptr);
}
errno = EAFNOSUPPOPT;
return (NULL);
}
// 用inet_pton(AF_INET, cp, &src.sin_addr);
// 代替src.sin_addr.s_addr = inet_addr(cp);

inet_pton()

int inet_pton(int family, const char *strptr, void *addrptr)
{
if (family == AF_INET) {
struct in_addr in_val;
if (inet_aton(strptr, &in_val)) {
memcpy(addrptr, &in_val, sizeof(in_val));
return (1);
}
}
errno = EAFNOSUPPOPT;
return (-1);
}
// 用char str[INET_ADDRATRLEN];
// ptr = inet_ntop(AF_INET, &src.sin_addr, str, sizeof(str));
// 代替ptr = inet_ntoa(src.sin_addr);
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
int main(void)
{
char *add;
struct sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("192.168.1.1");
add = inet_ntoa(addr.sin_addr);
printf("addr ip = %s.\n", add);
return 0;
}

inet_addr()

转换网络主机地址(点分十进制)为网络字节序二进制值,如果参数 char *cp 无效则返回-1(INADDR_NONE),但这个函数有个缺点:在处理地址为255.255.255.255时也返回-1,虽然它是一个有效地址,但inet_addr()无法处理这个地址。
in_addr_t inet_addr(const char *cp);

inet_ntoa()

net_ntoa()函数转换网络字节序地址->标准的点分十进制地址。该函数返回值指向保存点分十进制的字符串地址的指针,该字符串的空间为静态分配 的,所以在第二次调用这个函数时,意味着上一次调用并保存的结果将会被覆盖(重写)。
char *inet_ntoa(struct in_addr in);

主机字节序转网络字节序

  • IP地址和端口号都是需要转换成网络字节序
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
posted @   steve的miao  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示