cpp语言在Windows平台用OpenSSL实现C/S安全通信,怎么在同一台电脑上并行地运行多台客户机与服务器通信,要求每个客户机都有自己的命令行,给出参考代码
时间: 2024-05-04 22:19:28 浏览: 15
在同一台电脑上并行运行多台客户机与服务器通信可以使用多线程来实现,每个线程代表一个客户端。以下是一个简单的示例代码:
服务端代码:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define MAX_CLIENTS 10
#define SERVER_PORT 5555
using namespace std;
void handle_client(SSL* ssl) {
char buffer[1024];
int len;
SSL_read(ssl, buffer, sizeof(buffer));
cout << "Received message: " << buffer << endl;
string response = "Server response";
SSL_write(ssl, response.c_str(), response.length());
SSL_shutdown(ssl);
SSL_free(ssl);
}
int main() {
SSL_library_init();
SSL_CTX* ctx = SSL_CTX_new(TLS_server_method());
SSL_CTX_use_certificate_file(ctx, "server.crt", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM);
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t sin_size = sizeof(struct sockaddr_in);
server_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(server_fd, MAX_CLIENTS);
vector<thread> threads;
while (true) {
client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &sin_size);
cout << "New client connected." << endl;
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, client_fd);
SSL_accept(ssl);
threads.emplace_back(handle_client, ssl);
}
for (auto& t : threads) {
t.join();
}
SSL_CTX_free(ctx);
close(server_fd);
return 0;
}
```
客户端代码:
```cpp
#include <iostream>
#include <string>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 5555
using namespace std;
int main() {
SSL_library_init();
SSL_CTX* ctx = SSL_CTX_new(TLS_client_method());
int client_fd;
struct sockaddr_in server_addr;
client_fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, client_fd);
SSL_connect(ssl);
string message = "Hello from client!";
SSL_write(ssl, message.c_str(), message.length());
char buffer[1024];
int len = SSL_read(ssl, buffer, sizeof(buffer));
buffer[len] = '\0';
cout << "Received response: " << buffer << endl;
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
close(client_fd);
return 0;
}
```
这个示例代码实现了一个简单的回显服务器,当客户端连接到服务器后,发送一条消息,服务器会将消息回显给客户端。你可以在客户端代码中添加一个循环以模拟多个客户端同时运行的情况。
注意:这个示例代码仅作为参考,实际应用中需要进行更多的错误处理和安全性验证。
相关推荐
![](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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)