C++使用socket实现与微信小程序通信(修改)

Posted 小懵白生活小趣谈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++使用socket实现与微信小程序通信(修改)相关的知识,希望对你有一定的参考价值。

不会吧不会吧,竟然还没有人听说过C++能够使用socket与微信小程序在局域网下进行简单的通信。看来装逼的时刻到了,大家安静点,请看下图!


哈哈,开玩笑了,狗头保命C++使用socket实现与微信小程序通信(修改)要紧。今天打开博客发现的,难免激动了点,在这里呢感谢各位老铁的支持,话不多说,下面开始进入话题。

C++使用socket实现与微信小程序通信(修改)


首先我们要知道websocket是什么,它与socket有什么区别?

  • 简单来说,WebSocket是 html5 一种新的协议,是应用层的协议,一种双向通信协议 ,是建立在TCP之上的。

  • Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,连接建立与发送信息都是以TCP的

那么它的握手过程是什么样的,既然它是基于socket的,那么肯定少不了TCP三次握手了。可以简单概括为:

1、进行TCP三次握手

 WSADATA wsaData; SOCKET sockServer; SOCKADDR_IN addrServer; SOCKET conn; SOCKADDR_IN addr;
WSAStartup(MAKEWORD(2, 2), &wsaData); //创建Socket sockServer = socket(AF_INET, SOCK_STREAM, 0); //准备通信地址 addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addrServer.sin_family = AF_INET; addrServer.sin_port = htons(8090); //绑定 bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); //监听 listen(sockServer, 5);
int len = sizeof(SOCKADDR); //监听连接 conn = accept(sockServer, (SOCKADDR*)&addr, &len);



2、接收客户端HTTP请求包

 int ret = recv(conn, revData, 2048, 0); string revDataString = revData;  /*****打印websocket请求头信息 ****************/  cout << "revDataString:" << revData << endl;  
其中,客户端的的HTTP请求包信息为如下,我们需要的关键信息主要是 Sec-WebSocket-Key。
GET / HTTP/1.1Host: localhost:8080Origin: http://127.0.0.1:3000Connection: UpgradeUpgrade: websocketSec-WebSocket-Version: 13Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==
除此之外,在接收到信息以后。我们还需要进行判断当前是不是我们想要的握手协议,接着我们才去获取Sec-WebSocket-Key的信息,否则的话返回请求失败消息给用户。
string::size_type idx;  idx = revDataString.find("GET");   if (idx == string::npos)  cout << "当前不是握手协议, 握手失败" << endl;   int index = revDataString.find("Sec-WebSocket-Key");    if (index > 0)  WebSocketKeyString = revDataString.substr(index + 19, 24);   else  cout << "当前协议中不存在Sec-WebSocket-Key字段, 握手失败" << endl;


3、响应客户端

获取到秘钥后,接下来就是回复给客户端了,即发送HTTP相应包,相应包信息如下:
HTTP/1.1 101 Switching ProtocolsConnection:UpgradeSec-WebSocket-Accept: w4v7O6xFTi36lq3RNcgctw= 258EAFA5-E914-47DA-95CA-C5AB0DC85B11Upgrade: websocket

代码对应如下:

 strcat(request, "HTTP/1.1 101 Switching Protocols\r\n"); strcat(request, "Connection: upgrade\r\n"); strcat(request, "Sec-WebSocket-Accept: "); string server_key = WebSocketKeyString; server_key += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; SHA1 sha; unsigned int message_digest[5]; sha.Reset(); sha << server_key.c_str(); sha.Result(message_digest); for (int i = 0; i < 5; i++) { message_digest[i] = htonl(message_digest[i]); } base64 base; server_key = base.base64_encode(reinterpret_cast<const unsigned char*>(message_digest), 20); server_key += "\r\n"; strcat(request, server_key.c_str()); strcat(request, "Upgrade: websocket\r\n\r\n");

在这里大家需要注意一下的是,在发送websocket的HTTP对话里,是需要进行加密,这里采用的是SHA1加密算法。

最后的话就是就是发送相应包了。
int ret = send(conn,request, strlen(request), 0); if (ret > 0)  cout << "握手响应结果ret:" << ret <<","; else  cout << "握手响应失败, 关闭socket" << endl;

一些补充知识

typedef unsigned long u_long;typedef unsigned short u_short;
typedef struct sockaddr_in SOCKADDR_IN;
struct sockaddr_in { short sin_family; //协议类型 u_short sin_port; //端口号 struct in_addr sin_addr; //IP信息结构体 char sin_zero[8];};
typedef struct in_addr { union { struct { u_char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct { u_short s_w1, s_w2; } S_un_w; u_long S_addr; //这是我们需要的IP信息了 } S_un;} IN_ADDR, *PIN_ADDR, *LPIN_ADDR;
如上面可知 客户端信息都是保存在SOCKADDR_IN结构体中的,为 long int型的,那么我们怎么转化为我们平常所见的字符串格式呢?答案如下:
1、首先我们先把 类型的 IP地址,端口号信息拿出来。
SOCKADDR_IN addr;u_long addr=addr.sin_addr.S_un.S_addr;u_short port =addr.sin_port;
char* stringIP = (char*)malloc(16);memset(stringIP,0,16+1);toStringIP(addr,stringIP);

接着我们就去转化类型,其结果保存至stringIP

void toStringIP(const u_long ip,char *stringIP){ u_long tempIP=ip;
for(int i=0;i<3;i++) {
unsigned char part=(char)tempIP;
char temp[4];
sprintf(temp,"%d.",part);
strcat(stringIP,temp);
tempIP=tempIP>>8;
}
unsigned char part=(char)tempIP;
char temp[4];
sprintf(temp,"%d",part);
strcat(stringIP,temp);
}


好了,今天就先讲到这里了,如有同学需要sha1和base64的源码,请在后台回复sha1

下一期继续详解C++使用socket实现与微信小程序通信,感兴趣的同学可以关注一下哦!


蓝字


以上是关于C++使用socket实现与微信小程序通信(修改)的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序---Socket聊天功能实现

微信小程序webSocket多人通信案例

Vue Mixin 与微信小程序 Mixins 应用

技术分享| 音视频与微信小程序互通实践

技术分享| 音视频与微信小程序互通实践

微信小程序与微信公众号同一用户登录问题