1// WARNING: This won't build on Windows and Plan9.
2
3//
4//  Handling Ctrl-C cleanly in C.
5//
6
7package main
8
9import (
10	zmq "github.com/pebbe/zmq4"
11
12	"fmt"
13	"log"
14	"os"
15	"os/signal"
16	"syscall"
17	"time"
18)
19
20func main() {
21	//  Socket to talk to server
22	fmt.Println("Connecting to hello world server...")
23	client, _ := zmq.NewSocket(zmq.REQ)
24	defer client.Close()
25	client.Connect("tcp://localhost:5555")
26
27	// Without signal handling, Go will exit on signal, even if the signal was caught by ZeroMQ
28	chSignal := make(chan os.Signal, 1)
29	signal.Notify(chSignal, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM)
30
31	zmq.SetRetryAfterEINTR(false)
32
33LOOP:
34	for {
35		client.Send("HELLO", 0)
36		fmt.Println("Sent: HELLO")
37		reply, err := client.Recv(0)
38		if err != nil {
39			if zmq.AsErrno(err) == zmq.Errno(syscall.EINTR) {
40				// signal was caught by 0MQ
41				log.Println("Client Recv:", err)
42				break
43			} else {
44				// some error occurred
45				log.Panicln(err)
46			}
47		}
48
49		fmt.Println("Received:", reply)
50		time.Sleep(time.Second)
51
52		select {
53		case sig := <-chSignal:
54			// signal was caught by Go
55			log.Println("Signal:", sig)
56			break LOOP
57		default:
58		}
59	}
60}
61