C++ has the following function to receive bytes from socket, it can check for number of bytes available with the MSG_PEEK
flag. With MSG_PEEK
, the returned value of 'recv' is the number of bytes available in socket:
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
I need to get the number of bytes available in the socket without creating buffer
(without allocating memory for buffer
). Is it possible and how?
You're looking for is
ioctl(fd,FIONREAD,&bytes_available)
, and under windowsioctlsocket(socket,FIONREAD,&bytes_available)
.Be warned though, the OS doesn't necessarily guarantee how much data it will buffer for you, so if you are waiting for very much data you are going to be better off reading in data as it comes in and storing it in your own buffer until you have everything you need to process something.
To do this, what is normally done is you simply read chunks at a time, such as
And if you don't want to sit there waiting for data, you should look into
select
orepoll
to determine when data is ready to be read or not, and theO_NONBLOCK
flag for sockets is very handy if you want to ensure you never block on a recv.On Windows, you can use the
ioctlsocket()
function with theFIONREAD
flag to ask the socket how many bytes are available without needing to read/peek the actual bytes themselves. The value returned is the minimum number of bytesrecv()
can return without blocking. By the time you actually callrecv()
, more bytes may have arrived.