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

Popular posts from this blog

ios - iPhone/iPad different view orientations in different views , and apple approval process -

java Extracting Zip file -

C# WinForm - loading screen -