如何在中memcpy()一个结构sockaddr\u

如何在中memcpy()一个结构sockaddr\u,c,c89,C,C89,我正在编写一个服务器客户端程序。 在服务器上,我通过以下数据结构的数组管理客户端: 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=re

我正在编写一个服务器客户端程序。 在服务器上,我通过以下数据结构的数组管理客户端:

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
。但客户的下一次尝试是成功的,一切都很顺利。为什么会发生这种情况?

调用
recvfrom
时未填充
addr\u cli
recvfrom
的最后两个参数有点棘手。是的

struct sockaddr *src_addr,
socklen_t *addrlen
如果
src\u addr
不为空,则
recvfrom
期望
addrlen
指向
src\u addr
缓冲区的长度。(通常是
sockaddr
结构的大小)。如果
addrlen
的值太小,则返回的地址将被截断。调用
recvfrom
后,
addrlen
将设置为实际地址长度。请查看详细信息

因此,在调用recvfrom()之前,需要初始化
laddr\u cli

addr\u cli中的结构sockaddr\u;
socklen_t laddr_cli=sizeof(addr_cli);//您显示的代码看起来正常,因此原因必须在别处。但是不需要强制转换
(struct sockaddr*)
。显示
addr\u cli的声明
。同时执行
sizeof CLIENTS[client]。addr
而不是
sizeof(struct sockaddr*)
不太容易出错。能否检查
recvfrom
是否按预期填充了
addr\u cli
laddr\u cli
是否初始化为
sizeof addr\u 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);