Select Git revision
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))
*/
}