c - How to memcpy() a struct sockaddr_in -
i'm programming server-client program. on server manage clients through array of data structure:
struct client {     struct sockaddr_in addr;     /*...*/ };   struct client clients[max_cli];   when receive first packet client through udp socket
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);   i want copy address struct. do:
memcpy(&clients[client].addr,(struct sockaddr*)&addr_cli,     sizeof(struct sockaddr_in));  printf("ip client: %s",inet_ntoa(clients[client].addr.sin_addr);   the strange thing first try of communication fails, printing 0.0.0.0. next try client does, successful , goes fine. why happens?
the addr_cli not filled call recvfrom. last 2 arguments of recvfrom little bit tricky. are
struct sockaddr *src_addr, socklen_t *addrlen   if src_addr not null, recvfrom expects addrlen points length of src_addr buffer. (normally size of  sockaddr structure). if value of addrlen small, returned address truncated. after call recvfrom addrlen set actual address length. @ documentation details.
so need initialize laddr_cli before calling 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);      
Comments
Post a Comment