第一个nanomsg的程序

    这是我学习nanomsg的第一个程序,主要还是模仿nanomsg的例子写得,这里使用的模式为NN_PAIR,即一对一通信

这里实现了一个客户端和一个服务端。

    本人英文比较差,很多翻译都不准确,见谅

    首先我们先来看一下,程序中会调用到的函数,这里我推荐大家想要学习的可以去看nanomsg的官方文档,讲得挺详细的。

1.nn_socket

    int nn_socket (int domain, int protocol); 

    所在头文件:#include ,作用创建一个套接字:

 第一个参数有两个格式:AF_SP和AF_SP_RAW,AF_SP表示标准的格式AF_SP_RAW表示一种原始的格式,一般开发使用AF_SP即可。

返回值为套接字。

2.nn_setsockopt

 int nn_setsockopt (int s, int level, int option, const void *optval, size_t optvallen);

    所在头文件:#include ,作用和原始socket开发中的setsockopt类似,用来设置套接字的选项。

    第一个参数:nn_socket的返回值;

    第二个参数:一般使用NN_SOL_SOCKET;

    第三个参数:改变的选项,我的代码中只用到了NN_SNDTIMEO和NN_RCVTIMEO,主要是超时设置;

    第四个参数:第三个参数对应的值;

    第五个参数:第四个参数的长度。

返回值不为零表示失败。

3.nn_bind

    int nn_bind (int s, const char *addr);

    所在头文件#include ,作用绑定地址;

 第一个参数:套接字来自nn_socket的返回值;

 第二个参数:地址。

返回值小于零为失败

4.nn_connect

   int nn_connect (int s, const char *addr);

    所在头文件:#include ,连接另一个套接字。

 第一个参数:nn_socket的返回值;

 第二个参数:连接的地址。

返回值小于零为失败。

5.nn_send

    int nn_send (int s, const void *buf, size_t len, int flags);

    所在头文件:#include ,显而易见,发送数据。

 第一个参数:套接字,nn_socket返回值;

 第二个参数:发送的数据;

 第三个参数:发送的长度;

 第四个参数:0表示在阻塞模式下执行,1(NN_DONTWAIT),表示在非阻塞模式下执行。

返回值发送的长度,小于零错误。

6.nn_recv

 int nn_recv(int s,void * buf,size_t len,int flags);

    所在头文件:#include ,显而易见,接收数据。

 第一个参数:套接字,nn_socket返回值;

 第二个参数:接收的数据;

 第三个参数:接收的最大长度;

 第四个参数:0表示在阻塞模式下执行,1(NN_DONTWAIT),表示在非阻塞模式下执行。

返回值为接收到的数据长度。

下面贴代码

客户端:

// testnaomsgserver.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "nn.h"
#include "pair.h"
#include "utils\err.c"
#include 
#include 

#define SOCKET_ADDRESS1 "inproc://test"
#define SOCKET_ADDRESS2 "tcp://192.168.1.36:7766"
#define SOCKET_ADDRESS3 "tcp://*:7766"
#define HELLOWORLD "Hello world!"

int main()
{
	int rc = 0;
	int pair_socket = 0;
	int str_len = 0;
	char buf[256] = { 0 };
	char buf1[256] = { 0 };
	int timeo = 5000;
	//计算长度
	str_len = strlen(HELLOWORLD);
	//初始化socket
	pair_socket = nn_socket(1, NN_PAIR);
	if (pair_socket == -1) {
		printf("nn_socket failed! error: %s.\n", nn_err_strerror(errno));
		system("pause");
		nn_err_abort();
		return 0;
	}
	//设置超时
	rc = nn_setsockopt(pair_socket, 0, NN_SNDTIMEO, &timeo, sizeof(timeo));
	rc = nn_setsockopt(pair_socket, 0, NN_RCVTIMEO, &timeo, sizeof(timeo));
	//连接服务端
	rc = nn_connect(pair_socket, SOCKET_ADDRESS2);
	if (rc < 0) {
		printf("bind failed! error: %s.\n", nn_err_strerror(errno));
		system("pause");
		nn_err_abort();
		return 0;
	}
	//将hello world复制到buf中
	memcpy(buf, HELLOWORLD, str_len);
	while (1) {
		//发送数据
		rc = nn_send(pair_socket, buf, str_len, 0);
		if (rc < 0) {
			printf("nn_send failed! error: %s.rc = %d.\n", nn_err_strerror(errno), rc);
			continue;
		}
		//打印
		printf("send:%s\n", buf);
		//这里主要是测试使用,平时项目不要使用标签
	recv_test:
		//接收数据
		rc = nn_recv(pair_socket, buf1, 256, 0);
		if (rc < 0) {
			printf("nn_recv failed! error: %s.rc = %d.\n", nn_err_strerror(errno), rc);
			goto recv_test;//这里主要是测试使用,平时项目不要使用标签
		}
		//打印
		printf("recv:%s\n", buf1);
		memset(buf1, 0, 256);
		Sleep(1000);
	}
	//关闭套接字
	rc = nn_close(pair_socket);
	if (rc != 1) {
		printf("nn_close failed! error: %s.\n", nn_err_strerror(errno));
		system("pause");
		nn_err_abort();
		return 0;
	}
	return 0;
}


服务端:

// testnaomsgserver.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "nn.h"
#include "pair.h"
#include "utils\err.c"
#include 
#include 


#define SOCKET_ADDRESS1 "inproc://test"
#define SOCKET_ADDRESS2 "tcp://192.168.1.36:7766"
#define SOCKET_ADDRESS3 "tcp://*:7766"

#define HELLOWORLD "Hello world!"

int main()
{
	int rc = 0;
	int pair_socket = 0;
	int str_len = 0;
	char buf[256] = { 0 };
	char buf1[256] = { 0 };
	int timeo = 5000;
	//计算长度
	str_len = strlen(HELLOWORLD);
	//初始化socket
	pair_socket = nn_socket(1, NN_PAIR);
	if (pair_socket == -1) {
		printf("nn_socket failed! error: %s.\n", nn_err_strerror(errno));
		system("pause");
		nn_err_abort();
		return 0;
	}
	//设置超时
	rc = nn_setsockopt(pair_socket, 0, NN_SNDTIMEO, &timeo, sizeof(timeo));
	rc = nn_setsockopt(pair_socket, 0, NN_RCVTIMEO, &timeo, sizeof(timeo));
	//绑定端口
	rc = nn_bind(pair_socket, SOCKET_ADDRESS2);
	if (rc < 0) {
		printf("bind failed! error: %s.rc = %d.\n", nn_err_strerror(errno), rc);
		system("pause");
		nn_err_abort();
		return ETIMEDOUT;
	}
	//将hello world复制到buf中
	memcpy(buf1, HELLOWORLD, str_len);	
	while (1) {
		//等待接收数据
		rc = nn_recv(pair_socket, buf, 256, 0);
		if (rc < 0) {
			printf("nn_recv failed! error: %s.rc = %d.\n", nn_err_strerror(errno), rc);
			continue;
		}
		//打印
		printf("recv:%s\n", buf);
		memset(buf, 0, 256);
		//这里主要是测试使用,平时项目不要使用标签
	send_test:
		//发送数据
		rc = nn_send(pair_socket, buf1, str_len, 0);
		if (rc < 0) {
			printf("nn_recv failed! error: %s.rc = %d.\n", nn_err_strerror(errno), rc);
			goto send_test;//这里主要是测试使用,平时项目不要使用标签
		}
		printf("send:%s\n", buf1);
	}
	//关闭套接字
	rc = nn_close(pair_socket);
	if (rc != 1) {
		printf("nn_close failed! error: %s.\n", nn_err_strerror(errno));
		system("pause");
		nn_err_abort();
		return 0;
	}
    return 0;
}



你可能感兴趣的:(通讯)