L o a d i n g . . .
主打一个C++
文章详情

电脑本地部署deepseek-r1等扩展

Posted on 2025-01-08 07:34:46 by 主打一个C++

系统环境:windows

第一步:下载ollama网址: https://ollama.com/

image.png

进入页面:依次点击下载,如果是其他系统同理

image.png

等待下载完成:image.png

下载完成后直接安装即可。

第二步:下载模型

回到首页,点击图中箭头

image.png

进入界面:

image.png

电脑不是很差的情况下,8b直接跑就行,大小比较适中,点击后进入下一步复制指令

image.png

打开cmd窗口(win+r)粘贴进去回车就会自动下载了。

等待下载完成后即可直接开始对话,如图:

image.png

测试对话:

image.png

慢慢玩,太牛逼了~~~

顺手写了个web ui  如图:

image.png

随手写的,只能说主要功能没问题。代码为单页,最下面可下载。

C++写的简单代理,破除ollama的同域策略:测试代码如下,ollama只要安装成功,直接运行下面代码会自动打开浏览器就可以对话了

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <thread>
#include <fstream>
#include <string>

#pragma comment(lib, "ws2_32.lib")
#pragma warning (disable:4996)

#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <stdio.h>

std::string g_html = "";

bool readHtml() {
    //读入html文件文本内容
    std::ifstream ifs("deepseek.html", std::ios::in | std::ios::binary);
    if (!ifs) {
        std::cerr << "Failed to open file." << std::endl;
        return 1;
    }
    std::string html((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
    g_html = html;
}

// 处理客户端连接的线程函数
DWORD WINAPI ClientHandlerThread(LPVOID lpParam) {
    SOCKET clientSocket = (SOCKET)lpParam;

    std::string msg = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: " + std::to_string(g_html.length()) + "\r\n\r\n" + g_html;
    send(clientSocket, msg.c_str(), msg.length(), 0);


    // 关闭客户端套接字
    //closesocket(clientSocket);
    return 0;
}
int Start() {
    WSADATA wsaData;
    SOCKET listenSocket = INVALID_SOCKET;
    sockaddr_in service;

    // 初始化 Winsock
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cerr << "WSAStartup failed." << std::endl;
        return 1;
    }

    // 创建监听套接字
    listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (listenSocket == INVALID_SOCKET) {
        std::cerr << "Socket creation failed." << std::endl;
        WSACleanup();
        return 1;
    }

    //复用
    int optval = 1;
    setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));

    // 设置服务端地址信息
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(9999);

    // 绑定套接字
    if (bind(listenSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
        std::cerr << "Bind failed." << std::endl;
        closesocket(listenSocket);
        WSACleanup();
        return 1;
    }

    // 开始监听
    if (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "Listen failed." << std::endl;
        closesocket(listenSocket);
        WSACleanup();
        return 1;
    }

    std::cout << "Listening on 127.0.0.1:9999" << std::endl;

    //打开网页
    ShellExecuteA(NULL, "open", "http://127.0.0.1:9999", NULL, NULL, SW_SHOWNORMAL);

    while (true) {
        // 接受连接
        SOCKET clientSocket = accept(listenSocket, NULL, NULL);
        if (clientSocket == INVALID_SOCKET) {
            std::cerr << "Accept failed." << std::endl;
            closesocket(listenSocket);
            WSACleanup();
            return 1;
        }

        readHtml();

        printf("Client connected.%lld\n", clientSocket);
        std::string msg = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: " + std::to_string(g_html.length()) + "\r\n\r\n" + g_html;
        send(clientSocket, msg.c_str(), msg.length(), 0);
        //break;
        // 创建一个新线程来处理客户端连接
        //std::thread clientThread(ClientHandlerThread, (LPVOID)clientSocket);
        //clientThread.detach(); // 分离线程,使其在后台独立运行

    
    }

    // 关闭监听套接字
    closesocket(listenSocket);
    WSACleanup();
    return 0;
}

bool isProcessRunning(const wchar_t* processName) {
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) {
        return false;
    }

    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);

    // 获取第一个进程
    if (!Process32First(hSnapshot, &pe)) {
        CloseHandle(hSnapshot);
        return false;
    }
    do {
 
        if (wcscmp(pe.szExeFile, processName) == 0) {
            CloseHandle(hSnapshot);
            return true;
        }
    } while (Process32Next(hSnapshot, &pe));

    CloseHandle(hSnapshot);
    return false;
}
int isRunOllama() {
    if (!isProcessRunning(L"ollama app.exe")) {
        std::string appPath = "";
        char* path = getenv("PATH");
        //printf("PATH=%s\n", path);
        char* token = strtok(path, ";");
        while (token != NULL) {
            //printf("%s\n", token);
            if ((strstr(token, "Ollama") != nullptr) || (strstr(token, "ollama") != nullptr)) {
                appPath = token;
                appPath += "\\ollama app.exe";
                printf("app=%s\n", appPath.c_str());
                break;
            }
            token = strtok(NULL, ";");
        }
        if (appPath.empty()) {
            printf("ollama app not found in PATH\n");
            return 1;
        }
        //启动ollama app
        HINSTANCE hInst = ShellExecuteA(NULL, "open", appPath.c_str(), NULL, NULL, SW_SHOWNORMAL);
        if ((int)hInst <= 32) {
            printf("ollama app launch failed\n");
            return 1;
        }
    }
    else {
        printf("ollama app is running\n");
    }
    return 0;
}
int main() {
    if (isRunOllama()) {
        printf("环境没装好吧???\n结束");
        system("pause");
        return 1;
    }

    return Start();
}


*转载请注明出处:原文链接:https://cpp.vin/page/119.html

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.02s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog