C++ 写一个websocket
时间: 2023-07-07 17:37:21 浏览: 63
要实现一个 Websocket 通信,需要使用 C++ 编写一个 Websocket 服务器程序,以下是一个简单的实现方式:
1. 创建一个 TCP 服务器,监听端口号;
2. 接收客户端连接请求,进行握手协议;
3. 握手协议成功后,服务端发送消息给客户端,客户端可以进行响应;
4. 服务器接收客户端的消息,并进行处理;
5. 服务器可以通过 Websocket 协议主动发送消息给客户端。
下面是一个简单的 C++ Websocket 服务器实现代码:
```c++
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
#define PORT 8888
#define BUF_SIZE 1024
string getWebSocketKey(string data) {
string key = "";
string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
data += guid;
unsigned char hash[20];
SHA1((const unsigned char*)data.c_str(), data.length(), hash);
key = base64_encode(hash, 20);
return key;
}
void sendHandshake(int sockfd, string data) {
string key = getWebSocketKey(data);
string response = "HTTP/1.1 101 Switching Protocols\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Accept: " + key + "\r\n\r\n";
send(sockfd, response.c_str(), response.length(), 0);
}
int main() {
int sockfd, newsockfd;
socklen_t clilen;
char buffer[BUF_SIZE];
struct sockaddr_in serv_addr, cli_addr;
int n;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
cout << "ERROR opening socket" << endl;
return 1;
}
bzero((char*) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) {
cout << "ERROR on binding" << endl;
return 1;
}
listen(sockfd, 5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr*) &cli_addr, &clilen);
if (newsockfd < 0) {
cout << "ERROR on accept" << endl;
return 1;
}
bzero(buffer, BUF_SIZE);
n = read(newsockfd, buffer, BUF_SIZE - 1);
if (n < 0) {
cout << "ERROR reading from socket" << endl;
return 1;
}
string data(buffer);
sendHandshake(newsockfd, data);
while (1) {
bzero(buffer, BUF_SIZE);
n = read(newsockfd, buffer, BUF_SIZE - 1);
if (n < 0) {
cout << "ERROR reading from socket" << endl;
break;
}
if (n == 0) {
cout << "Connection closed" << endl;
break;
}
cout << "Received message: " << buffer << endl;
}
close(newsockfd);
close(sockfd);
return 0;
}
```
这个程序实现了一个简单的 Websocket 服务器,它可以接收客户端的连接请求,并进行握手协议,然后接收客户端发送的消息,并输出到控制台上。请注意,这个程序仅仅是一个示例程序,实际运行时还需要根据实际需求进行修改和优化。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)