Files
wiki/cgo-libzmq/README.md
2025-01-22 10:22:35 +00:00

1.6 KiB

server.go

package main

/*
#cgo pkg-config: libzmq
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <malloc.h>
*/
import "C"
// sudo apt-get install libzmq3-dev
import (
	"unsafe"
	"fmt"
)

func main() {
	context := C.zmq_ctx_new()
	defer C.zmq_ctx_destroy(context)

	responder := C.zmq_socket(context, C.ZMQ_REP)
	defer C.zmq_close(responder)

	rc := C.zmq_bind(responder, C.CString("tcp://*:5555"))
	if rc != 0 {
		panic("Failed to bind socket")
	}

	for {
		buffer := make([]byte, 10)
		C.zmq_recv(responder, unsafe.Pointer(&buffer[0]), 10, 0)
		fmt.Println("Received Hello")
		C.sleep(1)
		message := unsafe.Pointer(C.CString("World"))
		defer C.free(message)
		C.zmq_send(responder, message, 5, 0)
	}
}

client.go

package main
/*
#cgo pkg-config: libzmq
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
*/
import "C"
import (
	"fmt"
	"unsafe"
)

func main(){
	fmt.Println("Connecting to hello world server…")
	
	context := C.zmq_ctx_new()
	defer C.zmq_ctx_destroy(context)

	requester := C.zmq_socket(context, C.ZMQ_REQ)
	defer C.zmq_close(requester)

	C.zmq_connect(requester, C.CString("tcp://localhost:5555"))

	// for request_nbr := range 10 {
	
	for request_nbr := 0; request_nbr < 10; request_nbr++ {
		buffer := make([]byte, 10)
		fmt.Printf("Sending Hello %d...\n", request_nbr)
		msg := unsafe.Pointer(C.CString("Hello"))
		defer C.free(msg)
		C.zmq_send(requester, msg, 5, 0);
		C.zmq_recv(requester, unsafe.Pointer(&buffer[0]), 10, 0);
		fmt.Printf("Received World %d\n", request_nbr)
	}
}