2017-10-09 6 views
-3

Je souhaite utiliser UDP et TCP l'un à côté de l'autre. quand je commente le travail partiel de la partie TCP UDP et quand je commente le travail partiel de la partie TCP d'UDP. J'ai besoin d'envoyer des messages avec TCP utilise alors en partie UDPGolang UDP et TCP l'un à côté de l'autre

func main() { 

// 
// ─── TCP ──────────────────────────────────────────────────────────────────── 
// 

// Listen for incoming connections. 
l, err := net.Listen("tcp", "localhost"+":"+"3000") 
if err != nil { 
    fmt.Println("Error listening:", err.Error()) 
    os.Exit(1) 
} 

// Close the listener when the application closes. 
defer l.Close() 
fmt.Println("Listening on " + "localhost" + ":" + "3000") 
for { 
    // Listen for an incoming connection. 
    conn, err := l.Accept() 
    if err != nil { 
     fmt.Println("Error accepting: ", err.Error()) 
     os.Exit(1) 
    } 
    // Handle connections in a new goroutine. 
    go gotcp.HandleRequest(conn) 
    //go handler(conn) 
} 

// 
// ─── UDP ──────────────────────────────────────────────────────────────────── 
// 

// then we should check which struct is empty and fill them 

/* Lets prepare a address at any address at port 10001*/ 
ServerAddr, err := net.ResolveUDPAddr("udp", ":3000") 
goudp.CheckError(err) 

/* Now listen at selected port */ 
ServerConn, err := net.ListenUDP("udp", ServerAddr) 
goudp.CheckError(err) 
defer ServerConn.Close() 

buf := make([]byte, 1024) 

for { 
    n, addr, err := ServerConn.ReadFromUDP(buf) 
    //fmt.Println("Received ", string(buf[0:n]), " from ", addr) 
    if err != nil { 
     fmt.Println("Error: ", err) 
    } 

    // *** broadcasting 
    //start := time.Now() 
    if v, ok := goudp.RRoom()[djr]; ok { 
     //fmt.Println("get room name ", v) 
     go goudp.BroadCast(string(buf[0:n]), djr, ServerConn, v) 
     //delete(R, "x") 
     //go sendResponse(ServerConn, v.UserAddr1) 
    } 
    //elapsed := time.Since(start) 
    //log.Printf("Binomial took %s", elapsed) 
} 

} 

EDIT: En passant une partie de tcp ou d'une partie udp dans une fonction et l'appeler comme aller tcpserver(), nous pouvons utiliser les deux UDP et TCP les uns avec les autres

+1

Yo Vous êtes engagé dans une boucle infinie qui accepte les connexions TCP, et vous vous attendez à ce qu'il sorte magiquement et tombe dans votre deuxième boucle infinie qui gère UDP entrant. Ça ne marchera pas. Pas clair pourquoi vous pensez qu'il devrait. – EJP

+0

La liaison de deux protocoles dans un port n'est généralement pas possible en réseau. – jeevatkm

+0

'Je veux utiliser UDP et TCP les uns avec les autres. TCP ne communique pas avec UDP. –

Répondre

1

Comme noté par putu, vous avez besoin d'une concurrence pour le faire fonctionner correctement. NodeJS fonctionne avec les rappels par défaut, ce qui signifie qu'une fois que vous passez une fonction en paramètre à une fonction, la boucle principale sera relâchée à l'instruction suivante, c'est pourquoi les applications nodejs ont cet object.method (function() {}) pattern, mais pour obtenir quelque chose de similaire à cela, vous devez envelopper la partie TCP et UDP dans une fonction séparée avec une boucle infinie.

Pour preuve le concept faire quelque chose comme ceci:

... 
go func(){ 
    // paste your tcp code here 
} 
... 
go func(){ 
    // paste your udp code here 
} 

Cette instruction « aller » dit au compilateur que cette partie du code doit fonctionner en mode simultané, bien sûr, dans un vrai projet mondial vous définirez ceux partie du code dans leur bon fonctionnement et il suffit d'appeler de votre fonction principale:

... 
go serveTCP(); 
go serve UDP(); 
... 

en savoir plus sur la concurrence dans les rendez-vous ici =>https://tour.golang.org/concurrency/1