nanomsg nn_recv
时间: 2023-07-28 15:07:35 浏览: 74
nanomsg是一个轻量级的网络通信库,nn_recv是它提供的一个函数,用于从套接字中接收数据。具体来说,nn_recv函数的作用是从指定的套接字中接收数据,并将接收到的数据存储到指定的缓冲区中。如果没有数据可用,则nn_recv函数将阻塞,直到有数据可用为止。nn_recv函数的调用形式如下:
```
int nn_recv (int s, void *buf, size_t len, int flags);
```
其中,参数s是接收端的套接字,buf是指向接收缓冲区的指针,len是缓冲区的大小,flags是接收时的标志位,用于指定如何接收数据。调用nn_recv函数成功时,返回值为接收到的数据大小;如果出现错误,则返回-1。
相关问题
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <nanomsg/nn.h> #include <nanomsg/reqrep.h> #define SERVER_ADDRESS "tcp://127.0.0.1:5555" // 服务器地址 int main() { int sock = nn_socket(AF_SP, NN_REQ); // 创建一个REQ类型的socket if (sock < 0) { fprintf(stderr, "nn_socket error: %s\n", nn_strerror(nn_errno())); return -1; } if (nn_connect(sock, SERVER_ADDRESS) < 0) { // 连接服务器地址 fprintf(stderr, "nn_connect error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } char *request = "123"; int request_len = strlen(request) + 1; int bytes = nn_send(sock, request, request_len, 0); // 发送请求消息 if (bytes < 0) { fprintf(stderr, "nn_send error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("client sent: %s\n", request); char *buf = NULL; bytes = nn_recv(sock, &buf, NN_MSG, 0); // 接收回复消息 if (bytes < 0) { fprintf(stderr, "nn_recv error: %s\n", nn_strerror(nn_errno())); nn_close(sock); return -1; } printf("client received: %s\n", buf); nn_freemsg(buf); // 释放接收到的消息内存 nn_close(sock); // 关闭socket return 0; } 以上是一个客户端代码,客户端发送内容“123”服务器回复“abc”,我想要更改一下,客户端发送一段json,使用libjansson,json内容为{"module":"1","from":"2","time":"","service":"get_dp_version","args":[]}
你可以将原来的请求消息改成一个json字符串,然后使用libjansson库将其序列化成一个字符数组,再发送给服务器。修改后的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <nanomsg/nn.h>
#include <nanomsg/reqrep.h>
#include <jansson.h>
#define SERVER_ADDRESS "tcp://127.0.0.1:5555" // 服务器地址
int main() {
int sock = nn_socket(AF_SP, NN_REQ); // 创建一个REQ类型的socket
if (sock < 0) {
fprintf(stderr, "nn_socket error: %s\n", nn_strerror(nn_errno()));
return -1;
}
if (nn_connect(sock, SERVER_ADDRESS) < 0) { // 连接服务器地址
fprintf(stderr, "nn_connect error: %s\n", nn_strerror(nn_errno()));
nn_close(sock);
return -1;
}
json_t *root = json_object(); // 创建一个json对象
json_object_set_new(root, "module", json_string("1")); // 设置module字段
json_object_set_new(root, "from", json_string("2")); // 设置from字段
json_object_set_new(root, "time", json_string("")); // 设置time字段
json_object_set_new(root, "service", json_string("get_dp_version")); // 设置service字段
json_object_set_new(root, "args", json_array()); // 设置args字段为空数组
char *request = json_dumps(root, 0); // 将json对象序列化成字符串
int request_len = strlen(request) + 1;
int bytes = nn_send(sock, request, request_len, 0); // 发送请求消息
if (bytes < 0) {
fprintf(stderr, "nn_send error: %s\n", nn_strerror(nn_errno()));
nn_close(sock);
return -1;
}
printf("client sent: %s\n", request);
char *buf = NULL;
bytes = nn_recv(sock, &buf, NN_MSG, 0); // 接收回复消息
if (bytes < 0) {
fprintf(stderr, "nn_recv error: %s\n", nn_strerror(nn_errno()));
nn_close(sock);
return -1;
}
printf("client received: %s\n", buf);
nn_freemsg(buf); // 释放接收到的消息内存
nn_close(sock); // 关闭socket
free(request); // 释放序列化后的字符串内存
json_decref(root); // 释放json对象内存
return 0;
}
```
c语言nanomsg的pub和sub
nanomsg是一个基于消息传递的通信库,它提供了多种通信模式,包括发布-订阅(pub-sub)模式。
在pub-sub模式中,有一个或多个发布者(publishers)将消息发送到一个或多个订阅者(subscribers)。发布者负责发送消息,而订阅者负责接收感兴趣的消息。
在C语言中使用nanomsg进行pub-sub通信可以按照以下步骤进行:
1. 创建一个发布者套接字(socket):
```c
int pubSocket = nn_socket(AF_SP, NN_PUB);
```
2. 绑定(bind)套接字到一个地址:
```c
int bindResult = nn_bind(pubSocket, "tcp://127.0.0.1:5555");
```
这里的地址可以是任意合法的网络地址,例如"tcp://127.0.0.1:5555"表示绑定到本地的5555端口。
3. 使用nn_send函数发送消息:
```c
const char* message = "Hello, subscribers!";
int sendResult = nn_send(pubSocket, message, strlen(message), 0);
```
4. 关闭套接字:
```c
int closeResult = nn_close(pubSocket);
```
订阅者的实现类似,但是需要创建一个订阅者套接字(socket),并且使用nn_connect函数连接到发布者的地址:
```c
int subSocket = nn_socket(AF_SP, NN_SUB);
int connectResult = nn_connect(subSocket, "tcp://127.0.0.1:5555");
```
然后使用nn_setsockopt函数设置订阅者感兴趣的消息主题:
```c
const char* topic = "important";
int setoptResult = nn_setsockopt(subSocket, NN_SUB, NN_SUB_SUBSCRIBE, topic, strlen(topic));
```
最后,使用nn_recv函数接收消息:
```c
char buffer[1024];
int recvResult = nn_recv(subSocket, buffer, sizeof(buffer), 0);
```
需要注意的是,发布者和订阅者的地址和主题需要匹配才能正常通信。同时,发布者和订阅者的代码可以运行在不同的进程或机器上。
这只是一个简单的示例,nanomsg提供了更多的功能和选项,你可以根据具体需求进行调整和扩展。