暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

windows下C++实现socket通信服务器(上)

小懵白生活小趣谈 2021-06-17
2229
1、Background

我想很多同学在玩C++使用socket通信的时候,或者C++使用socket实现与微信小程序通信的时候都只能限制于局域网。

不能够实现像微信、QQ聊天那样跨局域网登录,又苦于不懂服务器咋搞(感觉服务器高大上样子,怕了)。

今天呢,我就手把手教大家实现如何在windows下C++实现客户端socket高并发连接服务器。

2、Preparation task

服务器准备:

IT_小懵白使用的腾讯云,个体新用户免费注册后,有多种腾讯产品体验,链接地址:

https://cloud.tencent.com/act/free

因为刚上手体验的话,还是选择轻量级应用服务器,直接官方配置好你的选择的环境(windows等系统镜像)给你。
这里再付款8元左右能再加一个月,个人喜爱了。

然后点击管理,在远程登录中选择重置密码,密码修改后,在本地 Windows 计算机上,在【搜索程序和文件】中,输入 mstsc
输入服务器的公网 IP,点击链接,输入你的密码,登录就可以了。

接着就进入如下页面了,然后自己安装配置各种环境、软件就行了。

3、Simple_Testing
server.h代码:
    #ifndef LITTER_SERVER_H
    #define LITTER_SERVER_H


    #include <iostream>
    #include <Winsock2.h>
    using namespace std;


    class Litter_Server{
    public:

    SOCKET conn;

    Litter_Server();
    ~Litter_Server();
    bool Init_socket();
    bool IsSocketClosed(SOCKET clientSocket);

    private:
    int port;

    };
    #endif


    server.cpp代码:
      #include "litter_server.h"


      Litter_Server::Litter_Server(){
      }


      Litter_Server::~Litter_Server(){
      }


      bool Litter_Server::Init_socket(){
      WSADATA wsaData;
      SOCKET sockServer;
      SOCKADDR_IN addrServer;
      SOCKADDR_IN addr;

      WSAStartup(MAKEWORD(2, 2), &wsaData); //MAKEWORD(2, 2)版本号

      if (WSAStartup(MAKEWORD(2, 2), &wsaData)!= 0){

      cout << "WSAStartup调用失败!" << endl;
      return false;
      }


      sockServer = socket(AF_INET, SOCK_STREAM, 0 ); //IPv4、面向连接的套接字

      //准备通信地址
      addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//inet_addr("0.0.0.0");
      addrServer.sin_family = AF_INET;
      addrServer.sin_port = htons(81);

      bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //绑定
      listen(sockServer,SOMAXCONN );//监听
      int len = sizeof(SOCKADDR);
      conn = accept(sockServer, (SOCKADDR*)&addr, &len);//接受连接请求


      return true;
      }


      bool Litter_Server::IsSocketClosed(SOCKET clientSocket){
      bool ret = false;
      HANDLE closeEvent = WSACreateEvent();//创建一个事件对象(WSACreateEvent);

      WSAEventSelect(clientSocket, closeEvent, FD_CLOSE);//将一组SOCKET事件(FD_CLOSE)与事件对象关联(WSAEventSelect)

      DWORD dwRet = WaitForSingleObject(closeEvent, 0);



      if(dwRet == WSA_WAIT_EVENT_0)ret = true;

      else if(dwRet == WSA_WAIT_TIMEOUT)ret = false;


      WSACloseEvent(closeEvent);
      return ret;
      }


      main.cpp代码:
        #include "litter_server.h"
        #include "mysql.h"


        /* run this program using the console pauser or add your own getch, system("pause") or input loop */


        int main(int argc, char** argv) {

        Litter_Server server;

        server.Init_socket();

        char clieninfo[1080] = "";

        while(1)
        if (server.conn!= SOCKET_ERROR){
        int ret = recv(server.conn, clieninfo, 1080, 0);

        if(ret<=0&&server.IsSocketClosed(server.conn))break;
        cout<<"recive data:"<<clieninfo<<endl;
        }


        return 0;
        }

        client代码(python):

          from socket import *

          HOST = '你的服务器公网'
          PORT = (“你的端口设置”)
          BUFSIZ =1024
          ADDR = (HOST,PORT)

          tcpCliSock = socket(AF_INET,SOCK_STREAM)
          tcpCliSock.connect(ADDR)
          while True:
          data1 = input('>')
          #data = str(data)
          if not data1:
          break
          tcpCliSock.send(data1.encode())
          tcpCliSock.close()

          补充说明:

          为了使用方便,自己在腾讯云服务器管理那边的防火墙里添加规则:

          客户端Client端,这里我就没有给出C++代码了,因为我使用PyQt开发了个用户信息管理应用程序。所以就不给出C++的代码了,原理差不多了。

          4、End

          跨局域网socket通信实现后,接下来就是实现如何实现小型的高并发socket服务器。

          然后获取客户端信息后,进行调用MySQL保存信息了。


          shopping

          点击上方 蓝字 关注我们

          文章转载自小懵白生活小趣谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论