Socket
TCP
- Address Family
- AF_INET, IPv4 address
- AF_INET6, IPv6 address
- AF_UNIX, Unix Domain Socket, an interprocess communication protocol
- Socket Type
- SOCK_DGRAM, UDP
- SOCK_STREAM, TCP/IP
- Useful Functions
- getfqdn(), get a fully qualified domain name, which is a domain name that specifies its exact location in the tree hierarchy of the DNS
- gethostname(), get the host name of the current system
- gethostbyname(), get IPv4 address from host name
- gethostbyname_ex(), get host name, aliases, addresses
- gethostbyaddr(), get host name, aliases, and addresses by IP address
- getnameinfo(), translate socket address (host, port) to domain name and protocol
- getservbyname(), translate an internet service name to port number
- #!/usr/bin/python
-
- import socket
-
- #DNS
- print socket.getfqdn('www.google.com');
- print socket.gethostname();
- print socket.gethostbyname('localhost');
- print socket.gethostbyname('www.google.com');
- print socket.gethostbyname_ex('localhost');
- print socket.gethostbyaddr('4.2.2.2');
- print socket.getnameinfo((socket.gethostbyname('www.google.com'), 80), 0);
- print socket.getservbyname('http');
- print socket.getservbyport(80);
- print socket.getaddrinfo("www.google.com", 80, 0, 0, socket.IPPROTO_TCP)
- print socket.getdefaulttimeout();
-
- Client, get string from standard input, send it to server, then receive the feedback from server and print it to standard output
- Server, receive string from client, convert it to upper case, then send it back to client
- #server.py
- #!/usr/bin/python
-
- import socket
-
- HOST = '' # Symbolic name meaning all available interfaces
- PORT = 50007 # Arbitrary non-privileged port
-
- # Create a socket
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- # Bind the socket to an address
- s.bind((HOST, PORT))
-
- # Waiting for a connection
- s.listen(2)
- print 'Waiting for a connection ...'
-
- while 1:
- # Build a connection, create a new socket to handle it, get the client address
- conn, addr = s.accept()
- print 'Connecting server at: ', conn.getsockname(),
- print 'from client at: ', addr
- try:
- data = conn.recv(1024)
- print 'Received: ', data;
- #if not data: break
- conn.sendall(data.upper())
- except socket.error, msg:
- print "Error: ", msg;
- break
- conn.close()
-
- #client.py
- #!/usr/bin/python
-
- import socket
-
- # Server address
- HOST = '' # The remote host
- PORT = 50007 # The same port as used by the server
-
- # Create a socket
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- # Build a connection
- s.connect((HOST, PORT))
-
- # Read the message from keyboard
- m = raw_input("Eneter your message:\n");
- while len(m) < 1:
- m = raw_input("Not allow empty message, please re-input your message:\n");
- #m = input("Eneter your message:\n");# evaluate the string
-
- # Send the message to server
- s.send(m);
- #s.sendall('Hello, world')
-
- # Receive the feedback from server
- data = s.recv(1024)
- s.close()
-
- print 'Received from server:\n', data
- #print 'Received:\n', repr(data)
-
-
UDS
- the address of the socket is a path on the filesystem, rather than a tuple containing servername and port
- the node created in the filesystem to represent the socket persists after the socket is closed, and needs to be removed each time the server starts up
- #server.py
- #!/usr/bin/python
-
- import socket
- import sys
- import os
-
- server_address = './uds_socket'
-
- # Make sure the socket does not already exist
- try:
- os.unlink(server_address)
- except OSError:
- if os.path.exists(server_address):
- raise
-
- # Create a socket
- s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- print 'Socket name: ', s.getsockname();
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- # Bind the socket to an address
- s.bind(server_address)
-
- # Waiting for a connection
- s.listen(1)
- print 'Waiting for a connection ...'
-
- while 1:
- # Build a connection, create a new socket to handle it, get the client address
- conn, addr = s.accept()
- print 'Connecting server at: ', conn.getsockname(),
- print 'from client at: ', addr
- try:
- data = conn.recv(1024)
- print 'Received: ', data;
- #if not data: break
- conn.sendall(data.upper())
- except socket.error, msg:
- print "Error: ", msg;
- break
- conn.close()
-
- #client.py
- #!/usr/bin/python
-
- import socket
-
- # Create a socket
- s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- server_address = './uds_socket'
-
- # Build a connection
- s.connect(server_address)
-
- # Read the message from keyboard
- m = raw_input("Eneter your message:\n");
- while len(m) < 1:
- m = raw_input("Not allow empty message, please re-input your message:\n");
- #m = input("Eneter your message:\n");# evaluate the string
-
- # Send the message to server
- s.send(m);
- #s.sendall('Hello, world')
-
- # Receive the feedback from server
- data = s.recv(1024)
- s.close()
-
- print 'Received from server:\n', data
- #print 'Received:\n', repr(data)
-
UDP
- #server.py
- #!/usr/bin/python
-
- import socket;
-
- port = 50007;
-
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- s.bind(('', port))
-
- print 'UDP server ...'
-
- while 1:
- data, addr = s.recvfrom(1024)
- print 'server received %r from %r' % (data, addr)
- s.sendto(data.upper(), addr); #the socket should not be connected to a remote socket
-
- #client.py
- #!/usr/bin/python
-
- import socket
-
- # Server address
- HOST = '' # The remote host
- PORT = 50007 # the port of the server
-
- # Create a socket
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-
- # Read the message from keyboard
- m = raw_input("Eneter your message:\n");
- while len(m) < 1:
- m = raw_input("Not allow empty message, please re-input your message:\n");
- #m = input("Eneter your message:\n");# evaluate the string
-
- # Send the message to server
- s.sendto(m, (HOST, PORT));
-
- # Receive the feedback from server
- data = s.recv(1024)
- s.close()
-
- print 'Received from server:\n', data
- #print 'Received:\n', repr(data)
-
Binary Data
- #server.py
- #!/usr/bin/python
-
- import binascii
- import socket
- import struct
- import sys
-
- # Create a TCP/IP socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_address = ('localhost', 10000)
- sock.bind(server_address)
- sock.listen(1)
-
- # Create Struct instance
- s = struct.Struct('hhl');
-
- while True:
- print >>sys.stderr, '\nwaiting for a connection'
- connection, client_address = sock.accept()
- try:
- data = connection.recv(s.size)
- print >>sys.stderr, 'received "%s"' % binascii.hexlify(data)
-
- unpacked_data = s.unpack(data)
- print >>sys.stderr, 'unpacked:', unpacked_data
- finally:
- connection.close();
-
- #!/usr/bin/python
-
- import socket
- import struct
- import binascii
-
- # Create a TCP/IP socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_address = ('localhost', 10000)
- sock.connect(server_address)
-
- # Create Struct instance
- s = struct.Struct('hhl');
-
- # Pack information
- packed = s.pack(1, 2, 3);#pack data into a string
- sock.sendall(packed)
-
Flow Control
- #server.py TCP
- #!/usr/bin/python
-
- import binascii
- import socket
- import struct
- import sys
- import time
-
- # Create a TCP/IP socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server_address = ('localhost', 10000)
- sock.bind(server_address)
- sock.listen(1)
-
- # Create Struct instance
- s = struct.Struct('f');
- connection, client_address = sock.accept()
-
- num = 0;
-
- while True:
- try:
- data = connection.recv(s.size)
- unpacked_data = s.unpack(data)
- num += 1;
- print 'Received: ', num, unpacked_data
- time.sleep(0.01)
- except Exception, err:
- print err
- break;
-
- connection.close();
-
- #client.py TCP
- #!/usr/bin/python
-
- import socket
- import struct
- import binascii
- import random
-
- # Create a TCP/IP socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_address = ('localhost', 10000)
- sock.connect(server_address)
-
- # Create Struct instance
- s = struct.Struct('f');
-
- num = 0;
-
- # Pack information
- while True:
- n = random.random();
- packed = s.pack(n);#pack data into a string
- sock.sendall(packed)
- num += 1;
- print 'Sent: ', num, n
-
- #server.py UDP
- #!/usr/bin/python
-
- import binascii
- import socket
- import struct
- import sys
- import time
-
- # Create a TCP/IP socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server_address = ('localhost', 10000)
- sock.bind(server_address)
-
- # Create Struct instance
- s = struct.Struct('f');
-
- num = 0;
-
- while True:
- try:
- data, address= sock.recvfrom(s.size)
- unpacked_data = s.unpack(data)
- num += 1;
- print 'Received: ', num, unpacked_data
- time.sleep(0.001)
- except Exception, err:
- print err
- break;
-
- #client.py UDP
- #!/usr/bin/python
-
- import socket
- import struct
- import binascii
- import random
-
- # Create a TCP/IP socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- server_address = ('localhost', 10000)
-
- # Create Struct instance
- s = struct.Struct('f');
-
- num = 0;
-
- # Pack information
- while True:
- n = random.random();
- packed = s.pack(n);#pack data into a string
- sock.sendto(packed, server_address)
- num += 1;
- print 'Sent: ', num, n
-
Reference