我想很多同学在玩C++使用socket通信的时候,或者C++使用socket实现与微信小程序通信的时候都只能限制于局域网。
不能够实现像微信、QQ聊天那样跨局域网登录,又苦于不懂服务器咋搞(感觉服务器高大上的样子,怕了)。
今天呢,我就手把手教大家实现如何在windows下C++实现客户端socket高并发连接服务器。
2、Preparation task
服务器准备:
IT_小懵白使用的腾讯云,个体新用户免费注册后,有多种腾讯产品体验,链接地址:
https://cloud.tencent.com/act/free




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

#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
#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;}
#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 =1024ADDR = (HOST,PORT)tcpCliSock = socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)while True:data1 = input('>')#data = str(data)if not data1:breaktcpCliSock.send(data1.encode())tcpCliSock.close()
补充说明:
为了使用方便,自己在腾讯云服务器管理那边的防火墙里添加规则:

客户端Client端,这里我就没有给出C++代码了,因为我使用PyQt开发了个用户信息管理应用程序。所以就不给出C++的代码了,原理差不多了。
4、End
跨局域网socket通信实现后,接下来就是实现如何实现小型的高并发socket服务器。
然后获取客户端信息后,进行调用MySQL保存信息了。
shopping
点击上方 蓝字 关注我们
文章转载自小懵白生活小趣谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




