|
|
Re: sendto(msg) points to uninitialised byte(s)
On Thu, 18 Oct 2007 03:06:53 -0700, BlueJ <pengbin@gmail.com> wrote:
>My program is to send data using socket.. but I got the error message:
>"sendto(msg) points to uninitialised byte(s) " This is my source code
>
> 1. key_list = emalloc(BUFSIZE - sizeof(Key) - sizeof(byte) -
>sizeof(int));
> bzero(key_list, sizeof(*key_list));
>
> bp = key_list;
>
> memmove(bp, key, ID_LEN);
> bp += ID_LEN;
>
> memmove(bp, &ip_num, sizeof(int));
> bp += sizeof(int);
>
> pack_addr = htonl(addr);
> memmove(bp, &pack_addr, sizeof(ulong));
> bp +=sizeof(ulong);
>
> Ivn_send_key(srv, ttl, succ->addr, succ->port, bp, (bp -
>key_list), addr, port);
>
>2.
>void Ivn_send_key(Vnode *srv, byte ttl, ulong to_addr, ushort
>to_port, uchar *key_list, int list_len, ulong addr, ushort port)
>{
> byte buf[BUFSIZE];
>
> Ivn_send_raw(srv, to_addr, to_port, Ivn_pack_key(buf, ttl, key_list,
>list_len, addr, port), buf);
>}
>
>3.
>int Ivn_pack_key(uchar *buf, byte ttl, uchar *key_list, int list_len,
>ulong addr, ushort port)
>{
> //return Ivn_pack(buf, "ccxls", CHORD_KEY, ttl, key_list , port);
> uchar *bp;
> ushort sport;
>
> bp = buf;
>
> *bp++ = CHORD_KEY;
>
> *bp++ = ttl;
>
> sport = htons(port); //port number
> memmove(bp, (char *)&sport, sizeof(ushort));
> bp += sizeof(ushort);
>
> memmove(bp, key_list, list_len);
> bp += list_len;
> free(key_list);
>
> return bp -buf;
>}
>
>4.
>void Ivn_send_raw(Vnode *srv, in_addr_t addr, in_port_t port, int n,
>uchar *buf)
>{
> struct sockaddr_in dest;
>
> memset(&dest, 0, sizeof(dest));
> dest.sin_family = AF_INET;
> dest.sin_port = htons(port);
> dest.sin_addr.s_addr = htonl(addr);
>
> //fprintf(stderr, " dst addr is %s\n", inet_ntoa(dest.sin_addr));
>
> if (sendto(srv->out_sock, buf, n, 0, (struct sockaddr *) &dest,
> sizeof(dest)) < 0)
> warnm("sendto failed:"); /* ignore errors for now */
>}
>
>
>please to correct the error?
Hi BlueJ,
Others have replied to you with what I feel and most likely you feel
are of little to no to you at all. Within the context of what
they feel this newsgroup is about (discussing Standard C-related
issues), they are right (e.g., there are no Standard C functions such
as emalloc or bzero, and therefore the short-circuit rules apply and
you post is off-topic).
However, in a broader sense, which is programming in C (and the trials
and tribulations you will inevitable encounter, regardless of whether
you are programming in Standard C or not), those same people who
replied to your post are cheating you, and every reasonable person
like you who have committed such a serious error in C, of a more
reasonable response.
I'd bet each and every one of those posters who replied to your post
are aware of the non-standard function sendto() and its prototype, yet
they failed to use their knowledge of this to be of any real to
you, even though the type of error you committed could as just as
easily be committed in Standard C code.
Based on my knowledge of the non-standard function sendto(), it's
prototype is (for one of my compilers):
int sendto(
SOCKET s,
const char FAR *buf,
int len,
int flags,
const struct sockaddr FAR *to,
int tolen
);
What is not important is what SOCKET or FAR are defined as. What is
important is the definition of what the buf parameter is. Whether you
are using Linux or Windows or MAC OS X or any other OS, if your
compiler provides the sendto() function, its definition of the buf
parameter will invariably be something like this:
buf
[in] Buffer containing the data to be transmitted.
Given this definition (which effectively translates into buf being
something whose contents are transmitted and therefore needs to be
initialized/set to something BY YOU), it's obvious that what you pass
as the buf parameter to sendto() as a result of the uninitialized
local variable buf in Ivn_send_key() is your problem, and therefore
deserves the compiler warning you received.
Best regards
--
jaysome
|