💡 Add more explanations
This commit is contained in:
parent
1ff5a07a1f
commit
422d0b0bb0
1 changed files with 43 additions and 4 deletions
|
@ -35,17 +35,17 @@ string getCtxError() {
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
// Inistialize the SSL library
|
// Initializes the SSL library
|
||||||
if (OpenSSL_version_num() < 0x10100000L) {
|
if (OpenSSL_version_num() < 0x10100000L) {
|
||||||
// Old version, deprecated as of version 1.1.0
|
// Old version, deprecated as of version 1.1.0
|
||||||
SSL_library_init();
|
SSL_library_init();
|
||||||
|
|
||||||
// Loads human readable error strings
|
// Loads human readable error strings
|
||||||
// Automatically inistialized in newer versions
|
// Automatically initialized in newer versions
|
||||||
SSL_load_error_strings();
|
SSL_load_error_strings();
|
||||||
} else {
|
} else {
|
||||||
// New version
|
// New version
|
||||||
// Initalizes both SSl and crypto and is generally better
|
// Initializes both SSL and crypto and is generally better
|
||||||
OPENSSL_init_ssl(0, nullptr);
|
OPENSSL_init_ssl(0, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,32 +74,55 @@ int main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
cout << "Initializing server" << endl;
|
cout << "Initializing server" << endl;
|
||||||
|
|
||||||
|
// Initializes a new TCP socket in the IPv4 family
|
||||||
|
// 0 tells the OS to automatically pick the correct protocol (TCP)
|
||||||
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
|
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
if (serverSocket == -1) {
|
if (serverSocket == -1) {
|
||||||
cout << "Server socket failed" << endl;
|
cout << "Server socket failed" << endl;
|
||||||
|
return serverSocket;
|
||||||
}
|
}
|
||||||
|
|
||||||
sockaddr_in serverAddress;
|
sockaddr_in serverAddress;
|
||||||
|
|
||||||
|
// Specify that we use the IPv4 family
|
||||||
serverAddress.sin_family = AF_INET;
|
serverAddress.sin_family = AF_INET;
|
||||||
|
|
||||||
|
// Specify the port number
|
||||||
|
// htons converts it to bytes
|
||||||
serverAddress.sin_port = htons(8080);
|
serverAddress.sin_port = htons(8080);
|
||||||
|
|
||||||
|
// Specify the listen address
|
||||||
|
// inet_addr converts the string to bytes
|
||||||
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.50");
|
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.50");
|
||||||
|
|
||||||
|
// Bind the serverSocket to the serverAddress
|
||||||
|
// serverAddress is cast to a sockaddr
|
||||||
int bindStatus = bind(serverSocket, (struct sockaddr *)&serverAddress,
|
int bindStatus = bind(serverSocket, (struct sockaddr *)&serverAddress,
|
||||||
sizeof(serverAddress));
|
sizeof(serverAddress));
|
||||||
if (bindStatus == -1) {
|
if (bindStatus == -1) {
|
||||||
cout << "Bind failed" << endl;
|
cout << "Bind failed" << endl;
|
||||||
|
return bindStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
int listenStatus = listen(serverSocket, 5);
|
// Prepare to accept connections
|
||||||
|
// Only 1 is allowed, others will be denied as the server exits when a
|
||||||
|
// client leaves
|
||||||
|
int listenStatus = listen(serverSocket, 1);
|
||||||
if (listenStatus == -1) {
|
if (listenStatus == -1) {
|
||||||
cout << "Listen failed" << endl;
|
cout << "Listen failed" << endl;
|
||||||
|
return listenStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Await connection from a client
|
||||||
|
// We don't need the client's address nor do we know the length of it
|
||||||
int clientSocket = accept(serverSocket, nullptr, nullptr);
|
int clientSocket = accept(serverSocket, nullptr, nullptr);
|
||||||
if (clientSocket == -1) {
|
if (clientSocket == -1) {
|
||||||
cout << "Client socket failed" << endl;
|
cout << "Client socket failed" << endl;
|
||||||
|
return clientSocket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attach our SSL context to the socket
|
||||||
SSL *ssl = SSL_new(ctx);
|
SSL *ssl = SSL_new(ctx);
|
||||||
SSL_set_fd(ssl, clientSocket);
|
SSL_set_fd(ssl, clientSocket);
|
||||||
|
|
||||||
|
@ -110,25 +133,41 @@ int main() {
|
||||||
char *errStr = ERR_error_string(ERR_get_error(), nullptr);
|
char *errStr = ERR_error_string(ERR_get_error(), nullptr);
|
||||||
cout << "SSL_accept failed with SSL error: " << sslError << endl;
|
cout << "SSL_accept failed with SSL error: " << sslError << endl;
|
||||||
cout << "OpenSSL error: " << errStr << endl;
|
cout << "OpenSSL error: " << errStr << endl;
|
||||||
|
return sslAcceptCode;
|
||||||
} else {
|
} else {
|
||||||
cout << "negotiated SSL" << endl;
|
cout << "negotiated SSL" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
|
||||||
|
// Define buffer for incoming data
|
||||||
char buffer[1024] = {0};
|
char buffer[1024] = {0};
|
||||||
|
|
||||||
|
// Read the incoming data and save it to the buffer
|
||||||
SSL_read(ssl, buffer, sizeof(buffer) - 1);
|
SSL_read(ssl, buffer, sizeof(buffer) - 1);
|
||||||
|
|
||||||
|
// If the buffer is empty then the client has closed the connection
|
||||||
|
// Therefore just exit the while loop
|
||||||
if (strlen(buffer) <= 0) {
|
if (strlen(buffer) <= 0) {
|
||||||
cout << "Client seems to have just straight up left :(" << endl;
|
cout << "Client seems to have just straight up left :(" << endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The buffer contains data
|
||||||
|
// Print the data the client sent
|
||||||
cout << buffer << endl;
|
cout << buffer << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deallocate the SSL objects
|
||||||
SSL_free(ssl);
|
SSL_free(ssl);
|
||||||
|
|
||||||
|
// Deallocate the SSL context
|
||||||
SSL_CTX_free(ctx);
|
SSL_CTX_free(ctx);
|
||||||
|
|
||||||
|
// Deallocate the SSL error strings
|
||||||
ERR_free_strings();
|
ERR_free_strings();
|
||||||
|
|
||||||
|
// Close the network socket
|
||||||
close(serverSocket);
|
close(serverSocket);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Reference in a new issue