I am writing a C++ application on Linux. My application has a UDP server which sends data to clients on some events. The UDP server also receives some feedback/acknowledgement back from the clients.
To implement this application I used a single UDP Socket(e.g. int fdSocket
) to send and receive data from all the clients. I bound this socked to port 8080 and have set the socket into NON_BLOCKING mode.
I created two threads. In one thread I wait for some event to happen, if an event occurs then I use the fdsocket to send data to all the clients(in a for loop).
In the another thread I use the fdSocket
to receive data from clients (recvfrom()
). This thread is scheduled to run every 4 seconds (i.e. every 4 seconds it will call recvfrom()
to retrieve the data from the socket buffer. Since it is in NON-BLOCKING mode the recvfrom()
function will return immediately if no UDP data is available, then I will go to sleep for 4 secs).
The UDP Feedback/Acknowledge from all the clients has a fixed payload whose size is 20bytes.
Now I have two questions related to this implementation:
- Is it correct to use the same socket for sending/receiving UDP data with Mulitiple clients ?
- How to find the maximum number of UDP Feedback/Acknowledge Packets my application can handling without UDP Socket Buffer Overflow (since I am reading at every 4secs, if I receive lot of packets within this 4 seconds I might loose some packet ie., I need to find the rate in packets/sec I can handle safely)?
I tried to get the Linux Socket Buffer size for my socket (fdsocket
) using the function call getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
. From this function I discover that my Socket Buffer size is 110592. But I am not clear as what data will be stored in this socket buffer: will it store only the UDP Payload or Entire UDP Packet or event the Entire Ethernet Packet? I referred this link to get some idea but got confused.
Currently my code it little bit dirty , I will clean and post it soon here.
The following are the links I have referred before posting this question.
- Linux Networking
- UDP SentTo and Recvfrom Max Buffer Size
- UDP Socket Buffer Overflow Detection
- UDP broadcast and unicast through the same socket?
- Sending from the same UDP socket in multiple threads
- How to flush Input Buffer of an UDP Socket in C?
- How to find the socket buffer size of linux
- How do I get amount of queued data for UDP socket?
select()
call waiting for data? – Collin