Skip to content
Snippets Groups Projects
Select Git revision
  • 0b302e41abc055819c77c97a65af801cbdba470e
  • main default protected
2 results

Gnutella.go

Blame
  • Gnutella.go 3.90 KiB
    package main
    
    import (
    	"fmt"
    	"io/ioutil"
    	"log"
    	"math/rand"
    	"net/http"
    	"os"
    	"strconv"
    	"sync"
    
    	"github.com/gin-gonic/gin"
    	"gopkg.in/yaml.v2"
    )
    
    type nodeData struct {
    	ID         int         `yaml:"id"`
    	Address    string      `yaml:"address"`
    	Neighbours []Neighbors `yaml:"neighbors"`
    }
    
    type Neighbors struct {
    	ID      int    `yaml:"id"`
    	Address string `yaml:"address"`
    }
    
    var data nodeData
    var storage []string
    var idServ string
    var addressCur string
    var transmitter int
    var msgId = 0
    var err error
    var basePort = 8080
    var assignTransM sync.Mutex
    
    // album represents data about a record album.
    type album struct {
    	ID     string `json:"id"`
    	Neighb []int  `json:"price"`
    }
    
    // albums slice to seed record album data.
    var albums = []album{
    	{ID: "1", Neighb: []int{2, 3, 4}},
    	{ID: "2", Neighb: []int{1, 5, 6}},
    	{ID: "3", Neighb: []int{1, 6, 7}},
    	{ID: "4", Neighb: []int{1, 7}},
    	{ID: "5", Neighb: []int{2, 6}},
    	{ID: "6", Neighb: []int{2, 3, 5}},
    	{ID: "7", Neighb: []int{3, 4}},
    }
    
    func getRequest(urlTxt string) {
    	resp, err := http.Get(urlTxt)
    	printErr(err)
    	fmt.Println(resp.Status)
    }
    
    func initReq(c *gin.Context) {
    	nbIdServ, err := strconv.Atoi(idServ)
    	printErr(err)
    
    	msgId = rand.Intn(100) + nbIdServ
    	transmitter = -1
    	fmt.Println("\n Start of new research      ")
    	for _, x := range storage {
    		if x == c.Param("ressource") {
    			fmt.Println("\n Ressource exist in Client ")
    			break
    		}
    	}
    	for i := 0; i < len(albums); i++ {
    		if albums[i].ID == idServ {
    			for j := 0; j < len(albums[i].Neighb); j++ {
    				go getRequest("http://localhost:" + strconv.Itoa(basePort+albums[i].Neighb[j]) + "/req/" + idServ + "/" + c.Param("tlv") + "/" + strconv.Itoa(msgId) + "/" + c.Param("ressource"))
    			}
    		}
    	}
    }
    
    func receiveReq(c *gin.Context) {
    	idMsgInt, err := strconv.Atoi(c.Param("msgId"))
    	printErr(err)
    
    	assignTransM.Lock()
    	if msgId != idMsgInt {
    		msgId = idMsgInt
    		assignTransM.Unlock()
    
    		transmitterId, err := strconv.Atoi(c.Param("transmitter"))
    		printErr(err)
    		transmitter = transmitterId
    
    		tlv, err := strconv.Atoi(c.Param("tlv"))
    		printErr(err)
    
    		for _, x := range storage {
    			if x == c.Param("ressource") {
    				go getRequest("http://localhost:" + strconv.Itoa(basePort+transmitter) + "/foundReq/" + idServ + "/" + c.Param("ressource"))
    				break
    			}
    		}
    
    		tlv = tlv - 1
    		if tlv != 0 {
    			for i := 0; i < len(albums); i++ {
    				//Open Neighb reg of this node
    				if albums[i].ID == idServ {
    					for j := 0; j < len(albums[i].Neighb); j++ {
    						if transmitter != albums[i].Neighb[j] {
    							getRequest("http://localhost:" + strconv.Itoa(basePort+albums[i].Neighb[j]) + "/req/" + idServ + "/" + strconv.Itoa(tlv) + "/" + strconv.Itoa(msgId) + "/" + c.Param("ressource"))
    						}
    					}
    				}
    			}
    		}
    	} else {
    		assignTransM.Unlock()
    	}
    	c.Status(http.StatusOK)
    }
    
    //Called by child when ressource is find
    func foundReq(c *gin.Context) {
    	finderNb, err := strconv.Atoi(c.Param("finder"))
    	printErr(err)
    	portFinder := strconv.Itoa(basePort + finderNb)
    	if transmitter == -1 {
    		fmt.Println("\n Instance of " + c.Param("ressource") + " found in " + portFinder)
    	} else {
    		getRequest("http://localhost:" + strconv.Itoa(basePort+transmitter) + "/foundReq/" + c.Param("finder") + "/" + c.Param("ressource"))
    	}
    }
    
    func printErr(err error) {
    	if err != nil {
    		log.Fatal(err)
    		os.Exit(1)
    	}
    }
    
    func main() {
    
    	neighborsFile := os.Args[1]
    	idServ = os.Args[2]
    	buf, err := ioutil.ReadFile(neighborsFile)
    	err = yaml.Unmarshal(buf, &data)
    	printErr(err)
    	addressCur = data.Address
    
    	/*
    		nbIdServ, err := strconv.Atoi(idServ)
    		files, err := ioutil.ReadDir("Storage" + idServ + "/")
    		printErr(err)
    
    		for _, file := range files {
    			storage = append(storage, file.Name())
    		}
    
    		router := gin.Default()
    		router.GET("/initReq/:tlv/:ressource", initReq)
    		router.GET("/req/:transmitter/:tlv/:msgId/:ressource", receiveReq)
    		router.GET("/foundReq/:finder/:ressource", foundReq)
    
    		router.Run("localhost:" + strconv.Itoa(basePort+nbIdServ))
    	*/
    }