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

Popular posts from this blog

How to run C# code using mono without Xamarin in Android? -

c# - SharpSsh Command Execution -

python - Specify path of savefig with pylab or matplotlib -