The abstraction of reliable communication is done by the namespace udp. This name space makes three classes available to facilitate the use of the UDP for general implementations. These classes also perform the task of hiding C-socket programming details behind an idiomatic C-interface. As noted, the program is set for the values of 7 and m-2. The good exercises that can be performed during the experiment include: In general, the solution to an agreement problem must be three tests: termination, agreement and validity. As applied to the problem of the Byzantine general, these three tests are: this article presents the algorithm that solves the problem of the Byzantine general, as described first by Lamport, Pease and Shostak in 1982  . Although Lamport`s algorithm is not particularly complex, it can be difficult for programmers who are not used to working on distributed calculations to implement them. To accompany the explanation of the algorithm, I included a program to experiment with the solution. The definition of the algorithm in the original paper is short and concise, but at least in my experience, it is a bit confusing for programmers who don`t have much experience in distributed algorithms. In 1982, Lamport, Pease and Shostak published a fairly simple solution to this problem. The algorithm assumes that there is n process, with defective process ms, where > 3m.
Therefore, for a scenario like Figures 1 and 2 with 1 defective process, it would take at least 4 processes in the system to reach an agreement. (For the rest of this article, always refers to the number of processes, and m always refers to the number of faulty processes.) I`ve integrated a simple C-program with complete internal documentation that implements this algorithm. It has a process class that is used for sending and receiving messages, as well as for rolling the decision structure. A stroke class is used to define the number of processes, the number of defective processes, the source process, and the values that defective processes send in different rounds. To help with visualization, the program displays the structure of a particular process in the format used by dowry, in part the free Graphviz program. You can then use dot to create a beautiful image of the output diagram – all the numbers in this article were created this way. I think the use of the SVG format for output gives very readable results. Communication with remote processes has always been done in an isolated thread.
Instead of sending messages sequentially to each process, all processes were communicated in parallel. This prevented a faulty process from dividing functional processes due to a significant time delay. If, for example, the commander sent messages to 3 lieutenants, but the mate was defective and caused a chain exit, the first lieutenant landed far ahead of the third lieutenant in the agreement algorithm. Because all communication is parallel, all processes remain synchronized despite the existence of error processes, as they send and receive messages at about the same time.