C++使用socket实现与微信小程序通信(修改)
Posted 小懵白生活小趣谈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
GET / HTTP/1.1
Host: localhost:8080
Origin: http://127.0.0.1:3000
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==
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/1.1 101 Switching Protocols
Connection:Upgrade
Sec-WebSocket-Accept: w4v7O6xFTi36lq3RNcgctw= 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
Upgrade: 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");
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 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实现与微信小程序通信(修改)的主要内容,如果未能解决你的问题,请参考以下文章