这是我学习nanomsg的第一个程序,主要还是模仿nanomsg的例子写得,这里使用的模式为NN_PAIR,即一对一通信
这里实现了一个客户端和一个服务端。
本人英文比较差,很多翻译都不准确,见谅
首先我们先来看一下,程序中会调用到的函数,这里我推荐大家想要学习的可以去看nanomsg的官方文档,讲得挺详细的。
int nn_socket (int domain, int protocol);
所在头文件:#include
第一个参数有两个格式:AF_SP和AF_SP_RAW,AF_SP表示标准的格式,AF_SP_RAW表示一种原始的格式,一般开发使用AF_SP即可。
返回值为套接字。
int nn_setsockopt (int s, int level, int option, const void *optval, size_t optvallen);
所在头文件:#include
第一个参数: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;
}