Home > OS >  Linux isn't allowing to create enough sockets but not many sockets are being used
Linux isn't allowing to create enough sockets but not many sockets are being used

Time:09-23

My C application creates 64-128 UDP sockets.

It creates sockets using this code:

int sock = socket(AF_INET, SOCK_DGRAM, 0);
assert(sock != -1, strerror(errno));

const u_int yes = 1;
int result = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
printf("sock=%i result=%i errno=%i\n", sock, result, errno);
if(result != 0)
{
    FATAL(strerror(errno));
}

However, at the moment it's only creating 2 sockets because setsockopt() returns -1 on the third request:

sock=1023 result=-1 errno=0

(stderror(errno) just says success)

I'm puzzled because when I run ss it doesn't look like many sockets are in use:

ss -s
Total: 238
TCP:   85 (estab 16, closed 40, orphaned 0, timewait 37)

Transport Total     IP        IPv6
RAW       2         1         1        
UDP       24        17        7        
TCP       45        30        15       
INET      71        48        23       
FRAG      0         0         0 

My understanding is you may have 1023 sockets. So the above implies I should be able to create 64-128?

How/what is the problem here?

CodePudding user response:

There is no limit on number of open sockets, but there is more general limit on number of opened file descriptors. The fact that it fails on fd=1023 suggests that this limit was truly hit, since on a typical Linux:

  1. file descriptors are assigned consecutive numbers starting with 0
  2. default limit (ulimit -n) is 1024 opened file descriptors

You can check the number of opened file descriptors with ls -l /proc/<pid>/fd | wc -l. I suspect that you have many opened (regular) files.

  • Related