首页 > 数据库 >Mysql以及TCP socket的C++代码

Mysql以及TCP socket的C++代码

时间:2023-12-20 17:56:30浏览次数:28  
标签:log DataBase car send C++ TCP mysql socket

在使用socket编写tcp的C++程序时,遇到了一个问题:

那就bind冲突了,分析原因:是因为std中有bind函数,而socket中也有,但是没有报重复定义的错误,这就有一点难办了。

百度了一下:发现只要使用::bind就可以调用socket的bind。

下面把这个套接字socket的server端代码贴出来:

static void* serverThread(void* pointer)
    {
        ofstream log("connect.txt", std::ios::app);
        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
        CarDetect* p_car = (CarDetect*)pointer;
        WSADATA wsdata;
        if (WSAStartup(MAKEWORD(2, 2), &wsdata))
        {
            log << "WAS failed" << endl;
            WSACleanup();
            return FALSE;
        }
        SOCKET s_server, s_accept;
        s_server = socket(PF_INET, SOCK_STREAM, 0);
        if (s_server == INVALID_SOCKET)
        {
            log << "socket failed" << endl;
            WSACleanup();
            return FALSE;
        }
        //填充服务端信息
        SOCKADDR_IN server_addr;
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(8226);
        //当然这里也可以将 127.0.0.1改成你想要的ip或者 INADDR_ANY 为向所有ip发送信息
        server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

        //数据绑定服务器 s_server为服务端套接字
        if (::bind(s_server, (SOCKADDR*)&server_addr, sizeof(SOCKADDR)) == SOCKET_ERROR)
        {
            log << "listen failed" << endl;
            WSACleanup();
            return FALSE;
        }
        if (listen(s_server, 1) == SOCKET_ERROR)
        {
            log << "listen failed" << endl;
            WSACleanup();
            return FALSE;
        }

        sockaddr_in accept_addr;         //用来记录请求连接的套接字信息
        int len = sizeof(SOCKADDR);
        char recv_buf[8192] = { 0 };
        char send_buf[1024] = { 0 };


        while (true)
        {
            //接受连接请求
            s_accept = accept(s_server, (SOCKADDR*)&accept_addr, &len);
            while (true)
            {
                pthread_testcancel();
                int count = p_car->count;
                snprintf(send_buf, sizeof(send_buf), "%s", to_string(count).c_str());
                int sendLen = send(s_accept, (char*)send_buf, sizeof(send_buf), 0);
                if (sendLen < 0) {
                    log << "send failed" << endl;
                    break;
                }
                Sleep(2500);
            }
        }
    }

Mysql的线程也贴一下,注意这个mysql的C++库可以在官网下载:

static void* sqlThread(void* pointer)
    {
        ofstream log("sql.txt", std::ios::app);
        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
        pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
        CarDetect* p_car = (CarDetect*)pointer;

        mysql_init(&p_car->mysql);   //连接mysql,数据库
        //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
        const char DataBase_UserName[] = "root";    //数据库用户名username
        const char DataBase_Password[] = "a1234567";   //数据库密码
        const char DataBase_Host[] = "localhost";  //数据库连接地址
        const char DataBase_Name[] = "mysql";  //database name
        unsigned int DataBase_Port = 3306;            //server port

        if (!(mysql_real_connect(&p_car->mysql, DataBase_Host, DataBase_UserName, DataBase_Password, DataBase_Name, DataBase_Port, NULL, DataBase_Port)))
        {
            //TRACE1("Error connecting to database: %s\n", mysql_error(&mysql));
            log << "connect failed" << endl;
            return false;
        }

        while (true)
        {
            pthread_testcancel();
            //string sql_select="SELECT count FROM carcount";
            //vector<vector<wchar_t*>> res=selectData(p_car->mysql,sql_select);
            /*for (int i = 0; i < res.size(); i++)
            {
                for (int j = 0; j < res[i].size(); j++)
                {
                    log << res[i][j] << endl;
                }
            }*/

            //log << _wtoi(res[0][0]) << endl;
            string sql_update = "UPDATE carcount SET count = " + to_string(p_car->count) + ";";
            int ret = mysql_query(&p_car->mysql, sql_update.c_str());
            if (ret)
            {
                log << "update failed" << endl;
            }
            Sleep(5000);
        }
    }

 

标签:log,DataBase,car,send,C++,TCP,mysql,socket
From: https://www.cnblogs.com/xmds/p/17917147.html

相关文章

  • C++系列三:QT代码库
    目录前言QT小记1.菜单栏、工具栏、状态栏2.自定义的对话框3.任务管理器4.链接数据库mysql,sqlite5.WidgetsGalleryExample代码学习:999.ControlsQT-For-Python1.DemoQT-Quick1.HelloWorld2.简单表单前言记录有关qt的案例。QT小记知识点:1.ui_widget.h:类的名称是Ui......
  • websocket++
    一、介绍版本:WebSocket++(0.8.2)1、readme.md参照readme.mdWebSocket++是一个只有头文件(只有hpp文件)的c++库,它实现了RFC6455(WebSocket协议)。它允许将WebSocket客户端和服务端集成到c++程序中。它使用了可互换的网络传输模块,包括:基于原始字符缓冲区的模块基于c++的iostre......
  • 【网关开发】Openresty使用cosocket API 发送http与tcp网络请求
    背景为网关提供健康检查功能时需要对节点发送http或者tcp探活请求。Openresty提供cosocket来处理非阻塞IO。实现跟工程结合在一起,这里简单拼接数据结构localfunction__default_check_alive(status)returnstatus>=200andstatus<=299endlocalfunctiondebug_c......
  • Python语言实现两台计算机用TCP协议跨局域网通信
    成果展示:(这张图是在我本地电脑上用pycharm运行两个程序测试,实际可以在两台电脑上分别运行。)设备要求和实现的功能:实现的功能:跨局域网通信(仅支持两台计算机)跨局域网收发小文件,支持缓存在服务器,再一键接收(仅支持两台计算机)使用方法:在服务器上运行server.py程序,在两台客户......
  • 《算法、C++、Linux、Android》
    ......
  • C++引用在本质上是什么,它和指针到底有什么区别?
    参考文章:https://www.bilibili.com/read/cv13541907/对于指针变量P,引用变量Q,以及变量a=10;赋值过程:P=&a;&Q=a;P=&a:将变量a的地址传给指针P。a的地址上存的值是10;P的地址上存值是a的地址;*P:指向的是存在指针P上的地址(a的地址)上的内容,即a的值10。指针P指......
  • C++中的explicit关键字
    一、简介explicit关键字可以阻止隐式转换的发生。举例:C++中只带有一个参数的构造函数,或者或者除了第一个参数外其余参数都有缺省值的多参构造函数,承担了两个角色:(1)用于构建单参数的类对象。(2)隐含的类型转换操作符。一个类A的构造函数A(inti)就是既可以用来作为构造器,......
  • C++聊天集群服务器解决客户端注销登录问题
    客户端如何处理注销登录问题?问题描述:​ 在客户端登录后进行注销选择,然后重新登录刚才注销的账号,直接卡死。注意这是概率发生,因为是主线程和子线程抢服务器发送的信息,只有子线程抢到才会发生卡死问题产生原因分析:​ 前置条件:主线程循环等待用户输入选择(第一张图是死循环,send......
  • WebSocket和Socket的区别
    区别总结协议不同Socket是基于传输层TCP协议的,而Websocket是基于HTTP协议的。Socket通信是通过Socket套接字来实现的,而Websocket通信是通过HTTP的握手过程实现的。持久化连接传统的Socket通信是基于短连接的,通信完成后即断开连接。Websocket将HTTP协议升......
  • C++ Qt开发:QItemDelegate 自定义代理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStyledItemDelegate自定义代理组件的常用方法及灵活运用。在Qt中,QStyledItemDelegate类是用于......