c - udp client receiving a text file -
i trying receive text file on udp socket, client builds fine gives blank console, after experimentation i've found out problem lies reception, posting part of code:
size_t data=0; if(data=recvfrom( sd, file_buffer, sizeof(file_buffer), 0 , (struct sockaddr *) &server, &server_length) < 0) { printf("error receiving file."); exit(1); } if(data==sizeof(file_buffer)) { printf("received data:[%s]",file_buffer); }
you should re-write if forgot add parenthesis ()
if( data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)<0 )
reason:
precedence of < higher = in if() first < performed = , cause assigns data either 0 when data read , 1 when recvfrom() returns -1 on error.
@ c operator precedence table
you code equipment on read :
if(data = 1 < 0) and on recvfrom() fail like:
if(data = -1 < 0) mistake? forgot () parenthesis (or if don't know shold add.) like:
if( (data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)) <0 )
see added () like:
if( (data = recvfrom() ) < 0) ^ ^ added in code edit:
second error: "buffer not \0 terminated"
the function recvfrom() if successful worked, returns length, in bytes, of message or datagram. , if end-of-file condition received or connection closed, 0 returned.
the thing notice it doesn't puts '\0' symbol terminate buffer. , using '%s' print file_buffer[]'s content excepts null terminated string cause undefined behavior @ run time (and may unusual symbols on console if not getting segmentation-fault).
you should read less 1 of sizeof(file_buffer) , put null \0 explicitly, if wants use file buffer string.
i can suggest like:
no_of_bytes =recvfrom( sd, file_buffer, sizeof(file_buffer) - 1, 0, (struct sockaddr *) &server, &server_length ); file_buffer[no_of_bytes] = '\0'; now file_buffer null terminated can use %s, sure not making mistakes in other part of code.
Comments
Post a Comment