diff --git a/README.md b/README.md index 4d56d6bcb264c73995b7e98c79fd9cad9a53c130..2af2839041769d70a7173928b0943292e85360a5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ -# TP2_Freenet_Go_Socket +# TP2 Freenet Go Socket -Our amazing project ! \ No newline at end of file +Groupe: MARTINOTY, Jérémy; RÜHL, Julian + +# \ No newline at end of file diff --git a/server/deploy.py b/server/deploy.py index f9598fa40b9bf20db97e64bc13512f9cb0504a2d..da0a87531d70ad2b629b582fd0add3e2f5dfc132 100644 --- a/server/deploy.py +++ b/server/deploy.py @@ -59,7 +59,11 @@ for i in range(6): nodes.append(new_instance) print("Instance : " + instance_name + " created !") +<<<<<<< Updated upstream print("Waiting 60 seconds for cloud-init completion...") +======= +print("Waiting 60 seconds for cloud-init completion..."); +>>>>>>> Stashed changes sleep(60) for instance in nodes: diff --git a/server/server.go b/server/server.go index 3bc1bffa27ff0c9c93b5c1212e0ea892b8d2c340..7e55958b213d051abe290efa48602c324ec2e7db 100644 --- a/server/server.go +++ b/server/server.go @@ -15,6 +15,7 @@ import ( type Message struct { Id int Key int + Ttl int Type_ string } @@ -32,32 +33,46 @@ type Contenu struct { var ( thisnode Node port string - contents []Contenu + contents []Contenu requests []Message ) -func createMessage(id int, key int, _type string) Message { +func createMessage(id int, key int, ttl int, _type string) Message { return Message{ Id: id, Key: key, + Ttl: ttl, Type_: _type, } } -func createContenu(key int, origin string) { +func createContenu(key int, origin string) Contenu { return Contenu{ - Key: key, + Key: key, Origin: origin, } } func fillContents() { - rands := [10]int - rand.Seed(time.Now().UnixNano()) - for i:=0; i<len(rands); i++ { - rands[i] = rand.Intn(100) - contents = append(contents, createContenu(v[i],node.Address)) - } + var rands = [10]int{} + + rand.Seed(time.Now().UnixNano()) + for i := 0; i < len(rands); i++ { + rands[i] = rand.Intn(100) + contents = append(contents, createContenu(rands[i], thisnode.Address)) + } + + if thisnode.Id == 1 { + contents[3] = createContenu(0xc0ffee, thisnode.Address) + } + + if thisnode.Id == 2 { + contents[2] = createContenu(0xdead, thisnode.Address) + } + + if thisnode.Id == 3 { + contents[1] = createContenu(0xbeef, thisnode.Address) + } } func checkError(err error) { @@ -113,39 +128,58 @@ func handleNewConn(conn net.Conn) { fmt.Printf("Received : %+v", msg) if msg.Type_ == "REQUEST" { - handleRequest(msg, conn) + handleRequest(*msg, conn) } else if msg.Type_ == "POSITIVE" { - handlePositiveMessage(msg, conn) + handlePositiveMessage(*msg, conn) } else { - handleNegativeMessage(msg, conn) + handleNegativeMessage(*msg, conn) } } +func handleNegativeMessage(msg Message, conn net.Conn) { + +} + func handlePositiveMessage(msg Message, conn net.Conn) { + //transmettre message au noeud qui a démandé SAUF si nous étions le demandeur } +func getNode(id int) Node { + for _, node := range thisnode.Neighbours { + if node.Id == id { + return node + } + } + return thisnode +} + func handleRequest(msg Message, conn net.Conn) { - requests = append(requests, msg) - - if hasKey(msg.Key) { - sendMessage(createMessage(thisnode.Id, msg.Key, "POSITIVE")) + new_ttl := msg.Ttl - 1 + if hasAlreadyRequested(msg) { + sendMessage(createMessage(thisnode.Id, msg.Key, new_ttl, "NEGATIVE"), getNode(msg.Id)) } else { - //demander aux autres noeuds + requests = append(requests, msg) + if hasKey(msg.Key) { + sendMessage(createMessage(thisnode.Id, msg.Key, new_ttl, "POSITIVE"), getNode(msg.Id)) + } else { + sendMessageAllExcept(createMessage(thisnode.Id, msg.Key, new_ttl, "REQUEST"), getNode(msg.Id)) + } } } func hasKey(key int) bool { - for _, element := range content { + for _, element := range contents { if key == element.Key { - key_found = true + return true } } + return false } func hasAlreadyRequested(newreq Message) bool { for _, request := range requests { - if request.Id == newreq.Id && request.Key == newreq.Key { + if request.Key == newreq.Key { return true } } @@ -160,19 +194,27 @@ func main() { thisnode := readYaml(os.Args[2]) port := os.Args[1] - fillContents() - - fmt.Println("Starting server on " + thisnode.Address + ":" + port) + initial_node := false if os.Args[3] == "INIT" { - + initial_node = true + } else if os.Args[3] != "WAIT" { + fmt.Println("Bad invocation. Require INIT or WAIT!") + os.Exit(0) } + fillContents() + fmt.Println("Starting server on " + thisnode.Address + ":" + port) + listenSocket, err := net.Listen("tcp", thisnode.Address+":"+port) checkError(err) defer listenSocket.Close() + if initial_node { + sendMessage(createMessage(thisnode.Id, 0xc0ffee, 3, "REQUEST"), thisnode.Neighbours[0]) + } + for { connection, err := listenSocket.Accept()