socket.io-client-cpp compile and test with VS2019 win10


socket.io 官網的C++版的客戶端。https://github.com/socketio/socket.io-client-cpp

並不依賴boost了,所以相對比較好安裝,但是還是有不少明坑,暗坑。還是得寫下來

自帶的example太復雜了,一個簡單的控制台程序塞進大量沒P用的東西,什么mutex都來了。https://github.com/socketio/socket.io-client-cpp/blob/master/examples/Console/main.cpp

 

自己寫1個精簡版的控制台,特定windows平台下VS2019。

一、編譯

1.1 openssl

參考 https://www.cnblogs.com/dshvv/p/12271280.html

1.1.1 直接下載windows x64的編譯好的版本:http://slproweb.com/products/Win32OpenSSL.html

1.1.2 安裝到 D:\lib\OpenSSL-Win64

1.1.3 建立2個環境變量,以后似乎是openssl自用,1個是下面cmake編譯socket.io-client-cpp需要的。這里全都設置好

OPENSSL_HOME

D:\lib\OpenSSL-Win64\bin

OPENSSL_ROOT_DIR

D:\lib\OpenSSL-Win64

 

1.2 下載編譯

基本就是按官網 https://github.com/socketio/socket.io-client-cpp/blob/master/INSTALL.md#with-cmake

1.2.1 下載

git clone --recurse-submodules https://github.com/socketio/socket.io-client-cpp.git

一旦遇到任何433 Time out 

請直接設置代理。

注意直接全局設置代理:

git config --global http.proxy 127.0.0.1:1080

 

不要只在這一個語句設置代理。

$ git clone --recurse-submodules https://github.com/socketio/socket.io-client-cpp.git --config "http.proxy=127.0.0.1:1080"

否則只是下載socket.io-client-cpp時用到了代理,而下載依賴工程的時候,還是不用代理。

或者10053 啥的錯誤,

 git config --global http.sslVerify "false"

 1.2.2 編譯

安裝cmake。win10越搞越麻煩 https://www.cnblogs.com/xuanmanstein/p/15637571.html

 

cd 到 clone下來的源碼 路徑 :比如 D:\lib\socket.io-client-cpp

用gui版打開,

設置

CMAKE_INSTALL_PREFIX  = D:/lib/sioclient

防止默認安裝到C:/Program Files (x86)/sioclient  會在后面打開sln時麻煩

注意不要直接打開。而是要在開始菜單,找到vs2019的圖標,右鍵,"更多"-> "以管理員身份運行" (否則會在INSTALL時報錯 setlocal,沒有管理員權限就不能在C盤創建文件夾)

 

configure generate

會在這里產生vs2019版本的 sln

 

然后再選這個sln,

注意,編譯出的lib比較坑爹,並沒有區分release和debug 也就是debug沒有叫 sioclient_d.lib 

 

選擇,先Debug后release x64 

然后就簡單了,在項目管理器里先生成 ALL_BUILD 再 INSTALL。

 

install到 D:/lib/sioclient

里面include里3個.h文件:

sio_client.h

sio_message.h

sio_socket.h

lib里4個靜態庫lib

sioclient.lib

sioclient_tls.lib

debug install后手工把這2個改名為

sioclient_d.lib

sioclient_tls_d.lib

 

 

把sioclient文件夾整體復制到d:/lib里,作為自己demo使用的依賴項。

至此編譯完畢。

二、測試

 用py寫一個測試用的server

from gevent import monkey
monkey.patch_all()
from flask_socketio import SocketIO
from flask_socketio import send, emit
from flask_cors import CORS

from flask import Flask, render_template, session, request, jsonify

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['JSON_AS_ASCII'] = False
CORS(app)
#socketio = SocketIO(app, async_mode="gevent", ping_timeout=10, cors_allowed_origins='*', cors_credentials=False)
socketio = SocketIO(app, ping_timeout=10, cors_allowed_origins='*', cors_credentials=False)

@app.route('/', methods=['GET'])
def handle_target_kind():
    return 'hello world'
    emit('m1')


#-------------socketio---------------------

@socketio.on('connect')
def handle_connect():
    print('connect')
    emit('from server', '哈哈哈')

@socketio.on('disconnect')
def handle_disconnect():
    print('Client disconnected', request.sid)


@socketio.on('message_empty')
def handle_message_empty():
    print('message_empty')

@socketio.on('message_str')
def handle_message_str(data):
    print('message_str ', data)

@socketio.on('message_two')
def message_two(d1, d2):
    print('message_two ', d1, d2)

# @sio.event
# def message_list(sid, data):
#     print('message_list ', data)

# @sio.event
# def message_list(sid, data):
#     print('message_list ', data)





if __name__ == '__main__':
    print('flask socketio start')
    socketio.run(app, host='0.0.0.0', port=5000)

 

cpp客戶端

#include <iostream>
#include <sio_client.h>
#include <sio_message.h>
#include <sio_socket.h>

using namespace sio;
using namespace std;

void OnConnect(sio::event &)
{
//不能在OnConnect里emit!
std::cout << "connected \n";
}

 
         

void OnTargetChanged(sio::event& ev)
{
std::cout << "OnTargetChanged \n";
//接收消息
const sio::message::list message_received = ev.get_message();
std::cout << message_received.size() << std::endl;
//必須轉成特定類型的消息
std::cout << message_received[0]->get_string() << std::endl;
//其他消息里可以emit
message::list li("sports");
li.push(string_message::create("economics"));
current_socket->emit("message_two", li);
}


int main() { socket::ptr current_socket; sio::client h; h.connect("http://127.0.0.1:5000"); current_socket = h.socket();

      current_socket->on("connect", &OnConnect);
      current_socket->on("target_changed", &OnTargetChanged);

 
         

      //如果需要在連接時發送消息,需要在connect外面emit
      message::list para("worker");
     current_socket->emit("online", para);

//current_socket->on("connect", &OnMessage);


while (true) { } std::cout << "Hello World!\n"; h.sync_close(); h.clear_con_listeners(); return 0; }

這是最簡單版本的demo了,連接上不用等待,就可以直接emit,但是必須后面跟1個while 死等,這樣就能收發到。

 注意不能在onconnect里emit。GitHub上也有人問這個

如果想連接成功后立即發送什么,直接寫在外面。

接收消息時 先轉型為message::list, 再具體轉型。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM