如何使用inet_addr()为变量a,b,c和d分配IP地址 这样我就可以发送数据了:
a=rcvsdheader->Option.IPv4Address>>24;
//printf("the msb of ipv4 is %d\n",a);
b=rcvsdheader->Option.IPv4Address>>16&0x000000FF;
//printf("the msb of ipv4 is %d\n",b);
c=rcvsdheader->Option.IPv4Address>>8&0x000000FF;
//printf("the msb of ipv4 is %d\n",c);
d=rcvsdheader->Option.IPv4Address&0x000000FF;
//printf("the msb of ipv4 is %d\n",d);
if(rcvsdheader->Option.Protocol==UDP)
printf("The Type of Protocol is UDP\n");
printf("The PortNumber i%d\n",rcvsdheader->Option.Portnumber);
e=rcvsdheader->Option.Portnumber;
if ( (s=socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
die("socket");
}
someipServeraddr.sin_family = AF_INET;
someipServeraddr.sin_addr.s_addr=inet_addr();
someipServeraddr.sin_port = htons(e);
答案 0 :(得分:1)
inet_addr
将包含IPv4地址的文本表示形式的字符串作为参数:
in_addr_t inet_addr(const char *cp);
inet_addr()
函数将Internet主机地址cp从 IPv4数字和点符号转换为网络字节顺序的二进制数据。如果输入无效,INADDR_NONE
(通常为-1
) 退回。使用此函数是有问题的,因为-1是有效地址(255.255.255.255)。避免使用它来支持inet_aton()
,inet_pton(3)
或getaddrinfo(3)
,它们提供了一个 更简洁的方式来指示错误返回。
因此,我们可以使用sprintf
制作一个:
char buf[16];
sprintf(buf, "%u.%u.%u.%u", a, b, c, d);
someipServeraddr.sin_addr.s_addr = inet_addr(buf);
然而这一切都毫无意义。 s_addr
类型为in_addr_t
,对于POSIX上的typedef
为uint32_t
,因此您可以直接使用rcvsdheader->Option.IPv4Address
:
someipServeraddr.sin_addr.s_addr = htonl(rcvsdheader->Option.IPv4Address);
(如果htonl
包含主机字节顺序中的地址,则需要IPv4Address
,例如,环回为整数0x7F000001
;如果您知道您的地址是在网络顺序中,请勿使用htonl
)。