如何使用收到的IP地址和端口号建立套接字连接

时间:2016-04-13 07:33:22

标签: c sockets

如何使用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);

1 个答案:

答案 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上的typedefuint32_t,因此您可以直接使用rcvsdheader->Option.IPv4Address

someipServeraddr.sin_addr.s_addr = htonl(rcvsdheader->Option.IPv4Address);

(如果htonl包含主机字节顺序中的地址,则需要IPv4Address,例如,环回为整数0x7F000001;如果您知道您的地址是在网络顺序中,请勿使用htonl)。