• C

sockets - send(), recv(), TCP, UDP

Hi !!

I had a few queries regarding the send(), recv() functions, and was hoping

someone could help me out ... :)

Blocking Sockets

(1)  I do a send on a TCP Connection. suppose i'm sending 10240 bytes. will

the send return before all the bytes have been sent (will it return with a

value of 2400 for example, meaning that it sent only 2400 bytes), or will it

always return only after all 10240 bytes have been sent ? (it might return

with a smaller value if the socket was closed before everything could be

sent, but will it return with a smaller value in any other scenario?)

(2) for point (1), What about UDP? will the function only return after all

the data has been sent? and what about the recv function in case of udp? does

it receive all the data at one shot (assuming i pass in a sufficiently large


(3) suppose in one thread, i call send with a huge amount of data to be sent

(e.g. 2 mb) (TCP socket). while this send is progressing, i call send on the

same socket from another thread. will any error be thrown? or will the data

in the second thread be sent after the send returns in the first thread?

(4) for point (3), what will happen if i use a UDP socket instead?

(5) i'm on a 10/100 mbps LAN. I will be calling send quite frequently, say

once every 4 seconds) If i use UDP instead of TCP, will it be faster or

slower? (all the destination PCs are on the same LAN, and in case of TCP, i

will be creating the socket and connect()-ing only once, during

initialization, and not every time i need to do a send.) (i know, udp is less

reliable, but would this unreliability be very much pronounced on a 10/100

mbps LAN?)

thanks :)

Who is Participating?
bsnh99Connect With a Mentor Commented:
1. For TCP, it should generally send all of the data without returning a short count. You should still check the return value to make sure you didn't get some kind of error (e.g. if remote closes connection before data finishes sending).

2. No. UDP is unreliable. If you try to send too much data at once, you'll overwhelm the socket and it will almost certainly drop some of the data. I think (not sure on this one), that if recv() gets the UDP packet, it will contain the entire packet. Note that it is possible that recv() will miss a packet, and it is possible for recv() to get packets out of order. Your protocol should handle these possibilities.

3. I'd suggest using a separate socket for each thread. You don't say what platform you're on, and socket libraries aren't necessarily thread-safe. You could check the documentation for your socket library.

4. Same as #3.

5. The decision of UDP vs TCP can depend on a number of variables. What kind of protocol are you using? Will you have to retransmit UDP packets if they are dropped? If you can describe the nature of your application a little more, I might be able to suggest one over the other.

Hope this helps.
muskad202Author Commented:
thanks :)
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.