事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件
Posted
技术标签:
【中文标题】事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件【英文标题】:C++ listener on event is not getting event using socket io C++ client 【发布时间】:2020-07-26 17:40:58 【问题描述】:我创建了示例应用程序,用于在作为 socket.io 服务器和 C++ 客户端运行的 node.js 应用程序之间发送/接收消息,下面是我的 C++ 客户端代码:
sio::client io;
socket::ptr current_socket;
string w = "harshil";
io.set_open_listener([&]()
io.socket()->emit("message", w); // Can able to send message to server
);
io.socket()->on("server", sio::socket::event_listener([&](event &e)
cout << __LINE__ << endl; // Can not print line :(
));
io.connect("http://127.0.0.1:8081");
在这里您可以看到,该客户端可以向服务器发送消息,但它无法接收基于“服务器”事件名称的消息,有人可以帮助我吗?
【问题讨论】:
【参考方案1】:对于那些像我一样坚持的人,下面的示例代码将对他们有所帮助。 为node.js创建不同的示例代码充当socket.io服务器,main.cpp文件充当客户端,
'use strict';
const express = require('express');
const app = express();
const serverHttp = require('http').Server(app);
const io = require('socket.io')(serverHttp);
const port = 8081;
io.on('connection', function (socket)
socket.on('message', function (data)
console.log("key received!!!" + data);
socket.emit('server', 'hello socket io');
console.log("sent server msg");
);
);
serverHttp.listen(port, function()
console.log("init!!!");
);
示例服务器应用程序,它接收来自客户端的请求并向客户端发送消息。
#include "sio_client.h"
#include <unistd.h>
#include <functional>
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <string>
#define HIGHLIGHT(__O__) std::cout<<"\e[1;31m"<<__O__<<"\e[0m"<<std::endl
#define EM(__O__) std::cout<<"\e[1;30;1m"<<__O__<<"\e[0m"<<std::endl
#define MAIN_FUNC int main(int argc ,const char* args[])
using namespace sio;
using namespace std;
std::mutex _lock;
std::condition_variable_any _cond;
bool connect_finish = false;
class connection_listener
sio::client &handler;
public:
connection_listener(sio::client& h):
handler(h)
void on_connected()
_lock.lock();
_cond.notify_all();
connect_finish = true;
_lock.unlock();
void on_close(client::close_reason const& reason)
std::cout<<"sio closed "<<std::endl;
exit(0);
void on_fail()
std::cout<<"sio failed "<<std::endl;
exit(0);
;
socket::ptr current_socket;
void bind_events()
current_socket->on("server", sio::socket::event_listener_aux([&](string const& name, message::ptr const& data, bool isAck,message::list &ack_resp)
_lock.lock();
cout << name << endl;
cout << data->get_string() << endl;
_lock.unlock();
));
MAIN_FUNC
sio::client h;
connection_listener l(h);
h.set_open_listener(std::bind(&connection_listener::on_connected, &l));
h.set_close_listener(std::bind(&connection_listener::on_close, &l,std::placeholders::_1));
h.set_fail_listener(std::bind(&connection_listener::on_fail, &l));
h.connect("http://127.0.0.1:8081");
_lock.lock();
if(!connect_finish)
cout << "wait\n";
_cond.wait(_lock);
_lock.unlock();
current_socket = h.socket();
string nickname;
while (nickname.length() == 0)
HIGHLIGHT("Type your nickname:");
getline(cin, nickname);
current_socket->emit("message", nickname);
bind_events();
sleep(10);
h.sync_close();
h.clear_con_listeners();
return 0;
示例客户端应用程序,它向服务器发送消息,并从服务器接收消息,
【讨论】:
以上是关于事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中的 UDP 套接字编程中获取“传输端点未连接”
Linux 上的 C++:设置套接字和数据包以最小化 RTP 流延迟