Lubuntu 20.04 64bit
node.js16.17.1
python 3.8.10
(1) Using node.js, launch the HTTP server in the http-server package on port 8000 in the appropriate directory.
npx http-server --port8000
(2) Prepare the python script named client.py
import asyncio
async def client():
reader, writer = wait asyncio.open_connection ('127.0.0.1', 8000)
writer.write(f'GET/HTTP/1.1\r\nHost:127.0.0.1\r\nConnection:keep-alive\r\n\r\n'.encode())
wait writer.drain()
data = wait reader.read (10240)
writer.close()
wait writer.wait_closed()
async def clients (N):
wait asyncio.gather(*[client() for_inrange(N)])
asyncio.run(clients(0x10000))
(3) Run the script prepared in (2) as follows.
python3 client.py; ss-an | grep8000 | grep TIME-WAIT | wc-l
<addition:running on ulimit-n 1048576
(4) After a few minutes, the following error will be displayed on the execution terminal of (2)
Traceback (most recent call last):
File "client.py", line 14, in <module>
asyncio.run(clients(0x10000))
File"/usr/lib/python 3.8/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File"/usr/lib/python 3.8/asyncio/base_events.py", line616, in run_until_complete
return future.result()
File "client.py", line 12, clients
wait asyncio.gather(*[client() for_inrange(N)])
File "client.py", line 4, client
reader, writer = wait asyncio.open_connection ('127.0.0.1', 8000)
File"/usr/lib/python 3.8/asyncio/streams.py", line 52, in open_connection
transport,_=wait loop.create_connection(
File"/usr/lib/python 3.8/asyncio/base_events.py", line 1025, create_connection
raise exceptions [0]
File"/usr/lib/python 3.8/asyncio/base_events.py", line 1010, create_connection
sock = wait self._connect_sock(
File"/usr/lib/python 3.8/asyncio/base_events.py", line 924, in_connect_sock
wait self.sock_connect(sock, address)
File"/usr/lib/python 3.8/asyncio/selector_events.py", line 496, insock_connect
return wait ft
File"/usr/lib/python 3.8/asyncio/selector_events.py", line 501, in_sock_connect
sock.connect (address)
OSError: [Errno99] Cannot assign requested address
16383
What is happening in this error?
I rewritten it.
import asyncio
async def client (id):
print(f'{id}:started')
reader, writer = wait asyncio.open_connection ('127.0.0.1', 8000)
writer.write(f'GET/HTTP/1.1\r\nHost:127.0.0.1\r\nConnection:keep-alive\r\n\r\n'.encode())
wait writer.drain()
# print(f'{id}:before read')
data = wait reader.read (10240)
# print(data)
# print(f'{id}:after read')
writer.close()
wait writer.wait_closed()
print(f'{id}:finished')
async def clients (N):
wait asyncio.gather (*[client(i) for i in range(N)])
asyncio.run(clients(0x10000))
asyncio.open_connection('127.0.0.1',8000)
specifies the port number to which you want to connect, but does not specify the port number that you want to use.In such cases, TCP/IP uses a port number called dynamic or ephemeral port.
$sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range=3276860999
Your machine has the above range and only has approximately 28,000 ports.
Apart from that, TCP/IP is a communication with the other party, and even if you end up using it, the other party may send you additional data.If you assign a port to another program in that state, later programs will receive incorrect data.The cooldown time to avoid such problems is TIME_WAIT
and cannot be reused for a certain period of time.
$sysctl net.ipv4.tcp_fin_timeout
net.ipv4.tcp_fin_timeout=60
I was not supposed to reuse my machine for 60 seconds.
These two things can happen, and 65,536 attempts to connect, such as asyncio.run(clients(0x10000))
, do not get any available ports and cannot start processing.
1589 When building Fast API+Uvicorn environment with PyInstaller, console=False results in an error
875 GDB gets version error when attempting to debug with the Presense SDK (IDE)
1039 M2 Mac fails to install rbenv install 3.1.3 due to errors
1070 Uncaught (inpromise) Error on Electron: An object could not be cloned
© 2025 OneMinuteCode. All rights reserved.