Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

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

Posted on 2004-09-11
Last Modified: 2008-03-10
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 :)

Question by:muskad202

Accepted Solution

bsnh99 earned 50 total points
ID: 12036773
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.

Author Comment

ID: 12037104
thanks :)

Featured Post

Is Your AD Toolbox Looking More Like a Toybox?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

791 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question