#!/usr/bin/python3

import socket

def make_client_socket (server_host, server_port):
    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.connect ((server_host, server_port))
    return s

def make_server_socket (server_port):
    s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind (('', server_port))
    s.listen ()
    return s

def recv_exactly (s, total_byte_no):
    # Utilise recv sur le socket s, en ajoutant la partie de message reçue à
    # res.  Quand res a la taille demandée par l'utilisateur, c'est à dire
    # total_byte_no, le travail est fini.
    res = b''
    while len (res) < total_byte_no:
        taille_qui_reste = total_byte_no - len (res)
        morceau = s.recv (taille_qui_reste)
        res = res + morceau

    # Le message reçu maintenant est complet.
    return res

# Par convention mes entêtes sont de 10 octets.
taille_entête = 10

def send (s, message):
    taille_du_message = len (message)
    taille_du_message_str = str (taille_du_message)
    taille_du_message_bytes = taille_du_message_str.encode ()
    # Je dois ajouter des chiffres 0 à gauche dans
    # taille_du_message_bytes pour arriver à une taille de
    # l'entête fixe.
    while len (taille_du_message_bytes) < taille_entête:
        taille_du_message_bytes = b'0' + taille_du_message_bytes
    # Maintenant la taille de taille_du_message_bytes est
    # exactement taille_entête.
    # À ce point je peux envoyer l'entête et le contenu.
    s.sendall (taille_du_message_bytes)
    s.sendall (message)

def receive (s):
    entête = recv_exactly (s, taille_entête)
    taille_du_message = int (entête)
    return recv_exactly (s, taille_du_message)
