如何 memcpy() 结构 sockaddr_in
How to memcpy() a struct sockaddr_in
我正在编写服务器-客户端程序。
在服务器上,我通过这个数据结构的数组来管理客户端:
struct Client
{
struct sockaddr_in addr;
/*...*/
};
struct Client CLIENTS[MAX_CLI];
当我通过 UDP
套接字收到来自客户端的第一个数据包时
struct sockaddr_in addr_cli;
memset(&addr_cli,0,sizeof(struct sockaddr_in));
b=recvfrom(SOCK_UDP_FATHER, &pdu, sizeof(pdu), MSG_DONTWAIT,
(struct sockaddr *)&addr_cli, (socklen_t *)&laddr_cli);
我想将他的地址复制到我的结构中。所以我这样做:
memcpy(&CLIENTS[client].addr,(struct sockaddr*)&addr_cli,
sizeof(struct sockaddr_in));
printf("IP client: %s",inet_ntoa(CLIENTS[client].addr.sin_addr);
奇怪的是第一次尝试通信失败,打印0.0.0.0
。但是客户所做的下一次尝试是成功的,一切都很顺利。为什么会这样?
addr_cli
未被调用 recvfrom
填充。 recvfrom
的最后两个参数有点棘手。他们是
struct sockaddr *src_addr,
socklen_t *addrlen
如果 src_addr
不为 NULL,则 recvfrom
期望 addrlen
指向 src_addr
缓冲区的长度。 (通常是 sockaddr
结构的大小)。如果addrlen
的值太小,返回的地址会被截断。在调用 recvfrom
之后,addrlen
将被设置为实际地址长度。详情请看documentation。
所以你需要在调用recvfrom()
之前初始化laddr_cli
:
struct sockaddr_in addr_cli;
socklen_t laddr_cli = sizeof(addr_cli); // <--
memset(&addr_cli,0,laddr_cli);
b=recvfrom(SOCK_UDP_FATHER, &pdu, sizeof(pdu), MSG_DONTWAIT,
(struct sockaddr *)&addr_cli, &laddr_cli);
我正在编写服务器-客户端程序。 在服务器上,我通过这个数据结构的数组来管理客户端:
struct Client
{
struct sockaddr_in addr;
/*...*/
};
struct Client CLIENTS[MAX_CLI];
当我通过 UDP
套接字收到来自客户端的第一个数据包时
struct sockaddr_in addr_cli;
memset(&addr_cli,0,sizeof(struct sockaddr_in));
b=recvfrom(SOCK_UDP_FATHER, &pdu, sizeof(pdu), MSG_DONTWAIT,
(struct sockaddr *)&addr_cli, (socklen_t *)&laddr_cli);
我想将他的地址复制到我的结构中。所以我这样做:
memcpy(&CLIENTS[client].addr,(struct sockaddr*)&addr_cli,
sizeof(struct sockaddr_in));
printf("IP client: %s",inet_ntoa(CLIENTS[client].addr.sin_addr);
奇怪的是第一次尝试通信失败,打印0.0.0.0
。但是客户所做的下一次尝试是成功的,一切都很顺利。为什么会这样?
addr_cli
未被调用 recvfrom
填充。 recvfrom
的最后两个参数有点棘手。他们是
struct sockaddr *src_addr,
socklen_t *addrlen
如果 src_addr
不为 NULL,则 recvfrom
期望 addrlen
指向 src_addr
缓冲区的长度。 (通常是 sockaddr
结构的大小)。如果addrlen
的值太小,返回的地址会被截断。在调用 recvfrom
之后,addrlen
将被设置为实际地址长度。详情请看documentation。
所以你需要在调用recvfrom()
之前初始化laddr_cli
:
struct sockaddr_in addr_cli;
socklen_t laddr_cli = sizeof(addr_cli); // <--
memset(&addr_cli,0,laddr_cli);
b=recvfrom(SOCK_UDP_FATHER, &pdu, sizeof(pdu), MSG_DONTWAIT,
(struct sockaddr *)&addr_cli, &laddr_cli);