我正在编写服务器-客户端程序。在服务器上,我通过以下数据结构数组管理客户端:
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
将设置为实际地址长度。看文档的详细信息。
因此,您需要laddr_cli
在调用之前进行初始化recvfrom()
:
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句