Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用收到的IP地址和端口号进行套接字连接_C_Sockets - Fatal编程技术网

C 如何使用收到的IP地址和端口号进行套接字连接

C 如何使用收到的IP地址和端口号进行套接字连接,c,sockets,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->

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

inet\u addr
将包含IPv4地址文本表示形式的字符串作为参数:

in_addr_t inet_addr(const char *cp);
inet\u addr()
函数将Internet主机地址cp从IPv4数字和点符号转换为网络字节顺序的二进制数据。如果输入无效,
INADDR\u NONE
(通常
-1
) 他回来了。使用此函数有问题,因为-1是有效地址(255.255.255.255)。避免将其用于
inet\u aton()
inet\u 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
在_addr_t中属于
类型,它是POSIX上
uint32_t
typedef
,因此您可以直接使用
rcvsdheader->Option.IPv4Address

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

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

someipServeraddr.sin_addr.s_addr
是POSIX上的
uint32_t
,只需将您的IPv4地址分配给
someipServeraddr.sin\u addr.s\u addr
htonl
ed即可。亲爱的Haapala,我想将变量a、b、c和d传递给inet\u addr()函数谢谢你,Haapala。它工作得很好。我选择sprintf是因为我的系统中的另一个函数需要bufcode@YallamandaDosakayala然后你可能会考虑亲爱的哈帕拉,你知道任何关于汽车协议,如CAN或大多数或套接字编程与线程,如果你知道我正在做一个新的汽车项目,你能不能给我一个指导,但是如果你还有其他问题要问,你应该发布另一个问题。将我的c代码(在Linux平台上开发)移植到micrium OS我想将简单的hello world程序交叉编译移植到micrium OS