Advertisement
Guest User

Untitled

a guest
Jan 14th, 2018
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.08 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4. import "flag"
  5. import "./message"
  6.  
  7. func main() {
  8.     nodesCntPtr := flag.Int("n", 0, "nodes cnt")
  9.     //withholdingPtr := flag.Int("t", 0, "withholding time")
  10.     flag.Parse()
  11.  
  12.     doneChan := make(chan int)
  13.     cnt := 0
  14.     for i := 0; i < *nodesCntPtr; i++ {
  15.         go start(i, *nodesCntPtr, doneChan)
  16.         cnt++;
  17.     }
  18.     for i := 0; i < *nodesCntPtr; i++ {
  19.         <-doneChan
  20.     }
  21.  
  22.     fmt.Println(cnt)
  23.  
  24. }
  25.  
  26. func start(nodeId int, nodesCnt int, leaderId int, doneChan chan int) {
  27.     monitorId = 0
  28.     msgPort, servicePort = 30000, 40000
  29.     prev, next = (nodeId + 1) % nodesCnt, (nodeId - 1) % nodesCnt
  30.  
  31.     ServerAddr, err := net.ResolveUDPAddr("udp",":10001")
  32.     CheckError(err)
  33.  
  34.     ServerConn, err := net.ListenUDP("udp", ServerAddr)
  35.     CheckError(err)
  36.     defer ServerConn.Close()
  37.  
  38.     ServerAddr, err := net.ResolveUDPAddr("udp",":10001")
  39.     CheckError(err)
  40.  
  41.     ServiceServerConn, err := net.ListenUDP("udp", ServerAddr)
  42.     CheckError(err)
  43.     defer ServerConn.Close()
  44.  
  45.  
  46.     buf := make([]byte, 1024)
  47.  
  48.     if nodeId == leaderId {
  49.         CheckError(ServerConn.SetReadDeadline(time.Now().Add(time.Second * 4)))
  50.     }
  51.     textToSends := ""
  52.     for {
  53.         select {
  54.         case n, addr, err := ServerConn.ReadFromUDP(buf):
  55.             if nodeId == leaderId {
  56.                 if addr == nil {
  57.                     sendUdp("", next)
  58.                 }
  59.                 CheckError(ServerConn.SetReadDeadline(time.Now().Add(time.Second * 4)))
  60.                 continue
  61.             }
  62.             msg := buf[0:n]
  63.             if empty(msg) {
  64.                 if (empty(msgToSend)) {
  65.                     sendUdp(msg, next)
  66.                 } else {
  67.                     sendMsg(nodeId, next, addresantId, textToSend, ServerConn)
  68.                     textToSend = ""
  69.                 }
  70.             } else {
  71.                 sendUdp(msg, next)
  72.             }
  73.         case n, addr, err := ServiceServerConn.ReadFromUDP(buf):
  74.             msg := NewMsg(buf[0:n])
  75.             if NewMsg()
  76.         }
  77.     }
  78.  
  79.     doneChan <- 1
  80. }
  81.  
  82. func sendMsg(nodeId, next, addresantId, msgToSends int, ServerConn struct {}) {
  83.     sendUdp(msgToSend, next)
  84.  
  85.     CheckError(ServerConn.SetReadDeadline(time.Now().Add(time.Second * 4)))
  86.     for {
  87.         n, addr, err := ServerConn.ReadFromUDP(buf)
  88.         msg := buf[0:n]
  89.         if isMsgForMe(msg) && getMsgText(msg) == "Accept" {
  90.             return
  91.         }
  92.         sendUdp(msgToSend, next)
  93.         CheckError(ServerConn.SetReadDeadline(time.Now().Add(time.Second * 4)))
  94.     }
  95. }
  96.  
  97. func sendUdp(msg, port) {
  98.     ServerAddr,err := net.ResolveUDPAddr("udp","127.0.0.1:" + port)
  99.     CheckError(err)
  100.  
  101.     LocalAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
  102.     CheckError(err)
  103.  
  104.     Conn, err := net.DialUDP("udp", LocalAddr, ServerAddr)
  105.     CheckError(err)
  106.  
  107.     buf := []byte(msg)
  108.     _,err := Conn.Write(buf)
  109.  
  110.     ServerConn.Close()
  111. }
  112.  
  113. func empty(msg string) {
  114.     return msg != ""
  115. }
  116.  
  117. func CheckError(err error) {
  118.     if err  != nil {
  119.         fmt.Println("Error: " , err)
  120.         os.Exit(0)
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement