if a program on your computer is connecting to the internet in any way, it's almost certainly using the socket API!
1.2.3.4:4321
using TCP
import socket s = socket.socket( socket.AF_INET, socket.SOCK_STREAM) s.connect( ("1.2.3.4", 4321)) s.send(b"hello!")
SOCK_STREAM
is used to create TCP connections. AF_INET
means "the internet".
127.0.0.1:1234
import socket s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) s.sendto(b'hi!', ('127.0.0.1', 1234))
SOCK_DGRAM
is used to send UDP packets
import socket s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) s.bind(('0.0.0.0', 1234)) # read 1 packet s.recvfrom(65000)
"0.0.0.0"
do?
0.0.0.0
isn't a real IP address. When passed to
bind
, it's code for "listen for connections on every
network interface". Often this means the loopback interface
(127.0.0.1
etc) and your ethernet/wireless card.
0.0.0.0
is also known as INADDR_ANY
.
SOCK_RAW
)
raw sockets let you send packets with protocols other than UDP or TCP.
ping
sends ICMP packets so it needs to use a raw socket.
for example, on Linux, the code that implements TCP and UDP is in the Linux kernel.
one important kind on Unix is "unix domain sockets", which let you listen on/connect to a file instead of an IP address
import socket s = socket.socket( socket.AF_UNIX, socket.SOCK_DGRAM) s.bind('/tmp/my.socket') print(s.recvfrom(10000))
it can just write the bytes it wants to send to the socket (like an HTTP response) and the operating system will decide how to split it up into packets.
it'll immediately send a UDP packet with the contents "hello". It won't buffer or anything.
your operating system might instead put "hello" in a buffer, wait for more writes, and combine them into a single TCP packet it sends later. It depends on how you've configured the socket.