# Tugas Pendahuluan
Pembuat Soal : NS
---
```bash
Nama : Hasan Abdullah Azzam
NPM : 2406428314
```
## Panduan setup
1. OS Windows
- VSCODE
1. Install Extension code runner. (Jika sudah bisa diskip)

2. Buka setting untuk extension tersebut

3. Cari executor map

4. Click edit in settings.json
5. Tambahkan "lws2_32" pada bagian cpp

6. Coba lakukan run pada kode yang ada dalam dasar teori modul
- DEVCPP
1. Buka tools dan click pada compiler options

2. Tambahkan "lws2_32" pada textbox tersedia dan nyalakan opsi yang tidak tercentang

3. Coba lakukan run pada kode yang ada dalam dasar teori modul
2. MacOS
- Tidak ada perlu setup tambahan, sehingga langsung lakukan run pada kode yang ada dalam dasar teori modul
### Screenshot hasil run dari kedua program yang ada di dasar teori :
#### 1. Server.cpp

#### 2. Client.cpp

---
## Teori
#### 1. Jelaskan apa itu socket programming dan mengapa socket programming dibutuhkan!
Socket programming adalah metode pemrograman komputer yang berfungsi untuk menghubungkan 2 perangkat atau proses untuk saling berkomunikasi melalui jaringan, satu proses berfungsi sebagai listen atau server untuk menerima port, dan satunya lagi berfungsi sebagai client sebagai pengirim data portnya.
salah satu kelebihan dari metode ini adalah kemampuanya untuk berkomunikasi 2 arah antara client dan server.
Referensi:
“Socket Programming in C++,” GeeksforGeeks, Dec. 31, 2023. https://www.geeksforgeeks.org/socket-programming-in-cpp/
M. Combeau, “Sockets and Network Programming in C - codequoi,” Codequoi.com, 2023. https://www.codequoi.com/en/sockets-and-network-programming-in-c/
#### 2. Jelaskan apa itu server node dan client node pada socket programming! Jelaskan juga perbedaan antara server node dan client node!
Dalam socket programming,ada 2 node utama yang digunakkan, client adalah perangkat yang meminta koneksi layanan atau data, sedangkan server adalah perangkat yang menyediakan layanan atau data yang diminta, nantainya server akan menunggu permintaan dari clinet agar kedua node terhubung.
Sederhanya, client memulai komunikasi dengan mengirimkan permintaan, dan server merespons permintaan tersebut.
Referensi:
“Socket Programming in C/C++ - GeeksforGeeks,” GeeksforGeeks, Sep. 05, 2018. https://www.geeksforgeeks.org/socket-programming-cc/
GeeksforGeeks, “Client-Server Model - GeeksforGeeks,” GeeksforGeeks, Oct. 23, 2019. https://www.geeksforgeeks.org/client-server-model/
#### 3. Jelaskan bagaimana proses server node dan client node saling berkomunikasi melalui jaringan dari awal hingga akhir! (Dapat menggunakan flowchart untuk membantu dalam penjelasan)
Server Node:

Client Node:

Referensi:
“Socket Programming in C/C++ - GeeksforGeeks,” GeeksforGeeks, Sep. 05, 2018. https://www.geeksforgeeks.org/socket-programming-cc/
“A Beginners Guide to Socket Programming in C,” DEV Community 👩💻👨💻. https://dev.to/sanjayrv/a-beginners-guide-to-socket-programming-in-c-5an5
#### 4. Jelaskan apa itu stream socket dan datagram socket! Jelaskan juga kapan masing - masing jenis socket digunakan dan perbedaan dari kedua socket tersebut!
Stream Socket:
Menggunakan metode protocol TCP untuk komunikasi yang andal, urut, dan dua arah. Data dikirim sebagai byte stream dan memastikan urutan serta keutuhan data. Jenis socket ini cocok untuk aplikasi seperti web browsing dan file transfer.
Datagram Socket:
Menggunakan metode protocol UDP untuk komunikasi yang cepat tapi tidak menjamin urutan atau kedatangan data. Pesan bisa diterima dalam urutan berbeda dan bisa duplikat. Jenis socket ini cocok untuk aplikasi seperti streaming atau game online.
Perbedaan Utama:
TCP (Stream Socket): Keandalan dan urutan data terjamin.
UDP (Datagram Socket): Lebih cepat, tapi tanpa kontrol urutan dan keandalan.
Referensi:
“Types of Socket,” GeeksforGeeks, May 25, 2022. https://www.geeksforgeeks.org/types-of-socket/
palak jain, “Differences between TCP and UDP - GeeksforGeeks,” GeeksforGeeks, Jun. 18, 2018. https://www.geeksforgeeks.org/differences-between-tcp-and-udp/
## Praktikal
#### 5. Buatlah sebuah program server node dan client node dengan spesifikasi berikut :<ol><li>Server dan client berkomunikasi secara dua araha</li><li>Client node mengirimkan sebuah kata dengan suatu angka yang akan di proses oleh server node</li><li>Server node akan melakukan caesar cipher pada kata yang dikirimkan oleh client dan digeser ke kanan sebanyak angka yang dikirimkan oleh client</li><li><ul><li>Jika password yang ada di server node dan hasil caesar cipher sama, maka server akan mengirimkan "Success" ke client</li><li>Jika password yang ada di server node dan hasil caesar cipher berbeda, maka server akan mengirimkan "Failed" ke client</li></ul></li><li>Input pada client hanya berupa lowercase letter</li><li>Password pada server di hardcode sebagai variable</li></ol>
contoh hasil run:
- case berhasil
1. Contoh 1

2. Contoh 2

3. Contoh 3

- case gagal
1. Contoh 1

2. Contoh 2

Template :
- Windows OS
- Server.cpp
```cpp
#include <iostream>
#include <string>
#include <winsock2.h>
#include <bits/stdc++.h>
using namespace std;
#define PORT 8888
#define PASSWORD "tmxa" //Boleh diganti
string decrypt(string text, int n){
string result = "";
for (int i = 0; i < text.length(); i++) {
result += char((int(text[i] - 97 + n) % 26) + 97);
}
return result;
}
void parseMessage(const string& messageRecv, string& pass, int& key) {
stringstream ss(messageRecv);
string temp;
getline(ss, temp, ' ');
pass = "";
for (int x = 0; x < temp.length(); x++) {
pass += char(tolower(temp[x]));
}
getline(ss, temp, ' ');
key = atoi(temp.c_str());
}
int main() {
WSADATA wsa;
SOCKET listen_socket, client_socket;
struct sockaddr_in server, client;
int c, recv_size;
char messageRecv[100];
string messageSend;
string pass;
int key;
// Kerjakan program kalian disini
return 0;
}
```
- Client.cpp
```cpp
#include <iostream>
#include <string>
#include <winsock2.h>
using namespace std;
#define SERVER "127.0.0.1"
#define PORT 8888
int main() {
WSADATA wsa;
SOCKET client_socket;
struct sockaddr_in server;
int recv_size;
char messageRecv[100];
string messageSend;
// Kerjakan program kalian disini
return 0;
}
```
- MacOS
- Server.cpp
```cpp
#include <iostream>
#include <string>
#include <cstring>
#include <sstream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cctype>
using namespace std;
#define PORT 8888
#define PASSWORD "tmxa" //Boleh diganti
string decrypt(string text, int n){
string result = "";
for (int i = 0; i < text.length(); i++) {
result += char((int(text[i] - 97 + n) % 26) + 97);
}
return result;
}
void parseMessage(const string& messageRecv, string& pass, int& key) {
stringstream ss(messageRecv);
string temp;
getline(ss, temp, ' ');
pass = "";
for (int x = 0; x < temp.length(); x++) {
pass += char(tolower(temp[x]));
}
getline(ss, temp, ' ');
key = atoi(temp.c_str());
}
int main() {
int listen_socket, client_socket;
struct sockaddr_in server{}, client{};
socklen_t c;
int recv_size;
char messageRecv[100];
string messageSend;
string pass;
int key;
// Kerjakan program kalian disini
return 0;
}
```
- Client.cpp
```cpp
#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
#define SERVER "127.0.0.1"
#define PORT 8888
int main() {
int client_socket;
struct sockaddr_in server{};
int recv_size;
char messageRecv[100];
string messageSend;
// Kerjakan program kalian disini
return 0;
}
```
Code hasil
server.cpp
```cpp
#include <iostream>
#include <string>
#include <winsock2.h>
#include <bits/stdc++.h>
using namespace std;
#define PORT 8888
#define PASSWORD "tmxa" //Boleh diganti
string decrypt(string text, int n){
string result = "";
for (int i = 0; i < text.length(); i++) {
result += char((int(text[i] - 97 + n) % 26) + 97);
}
return result;
}
void parseMessage(const string& messageRecv, string& pass, int& key) {
stringstream ss(messageRecv);
string temp;
getline(ss, temp, ' ');
pass = "";
for (int x = 0; x < temp.length(); x++) {
pass += char(tolower(temp[x]));
}
getline(ss, temp, ' ');
key = atoi(temp.c_str());
}
int main() {
WSADATA wsa;
SOCKET listen_socket, client_socket;
struct sockaddr_in server, client;
int c, recv_size;
char messageRecv[100];
string messageSend;
string pass;
int key;
// Kerjakan program kalian disini
cout << "Initialising Winsock...\n";
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
cerr << "WSAStartup failed. Error code: " << WSAGetLastError() <<endl;
return 1;
}
cout << "Winsock initialised.\n";
listen_socket = socket(AF_INET, SOCK_STREAM, 0);
if (listen_socket == INVALID_SOCKET) {
cerr << "Could not create socket. Error code: " << WSAGetLastError() <<endl;
WSACleanup();
return 1;
}
cout << "Socket created."<<endl;
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PORT);
if (bind(listen_socket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
cerr << "Bind failed. Error code: " << WSAGetLastError() <<endl;
closesocket(listen_socket);
WSACleanup();
return 1;
}
cout << "Bind done."<<endl;
listen(listen_socket, 3);
cout << "Waiting for incoming connections..."<<endl;
c = sizeof(struct sockaddr_in);
client_socket = accept(listen_socket, (struct sockaddr*)&client, &c);
if (client_socket == INVALID_SOCKET) {
cerr << "Accept failed. Error code: " << WSAGetLastError() <<endl;
closesocket(listen_socket);
WSACleanup();
return 1;
}
cout << "Connection accepted.\n\n";
recv_size = recv(client_socket, messageRecv, sizeof(messageRecv) - 1, 0);
if(recv_size == SOCKET_ERROR){
cout << "recv failed with error code" << WSAGetLastError()<<endl;
}
else {
messageRecv[recv_size] = '\0';
}
cout << "Pesan dari client: " << messageRecv <<endl;
parseMessage(messageRecv, pass, key);
string code = decrypt(pass,key);
cout<<"Hasil Cipher: "<<code<<"(key = "<<key<<")"<<endl;
string message;
if(code == PASSWORD){
message = "success, code terbuka";
}else{
message = "failed, code tidak terbuka";
}
cout<<message<<endl;
send(client_socket, message.c_str(), message.length(), 0);
return 0;
}
```
Client.cpp
```cpp
#include <iostream>
#include <string>
#include <winsock2.h>
using namespace std;
#define SERVER "127.0.0.1"
#define PORT 8888
int main() {
WSADATA wsa;
SOCKET client_socket;
struct sockaddr_in server;
int recv_size;
char messageRecv[100];
string messageSend,phars = "0";
// Kerjakan program kalian disini
cout << "Initialising Winsock..."<<endl;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
cerr << "WSAStartup failed. Error code: " << WSAGetLastError() <<endl;
return 1;
}
cout << "Winsock initialised."<<endl;
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == INVALID_SOCKET) {
cerr << "Could not create socket. Error code: " << WSAGetLastError() <<endl;
WSACleanup();
return 1;
}
cout << "Socket created."<<endl;
server.sin_addr.s_addr = inet_addr(SERVER);
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
if (connect(client_socket, (struct sockaddr*)&server, sizeof(server)) < 0) {
cerr << "Connection failed. Error code: " << WSAGetLastError() <<endl;
closesocket(client_socket);
WSACleanup();
return 1;
}
cout << "Connected to server.\n"<<endl;
cout << "Pesan yang ingin dikirim ke server: ";
getline(cin, messageSend);
send(client_socket, messageSend.c_str(), messageSend.length(), 0);
recv_size = recv(client_socket, messageRecv, sizeof(messageRecv) - 1, 0);
if(recv_size == SOCKET_ERROR){
cout << "recv failed with error code" << WSAGetLastError()<<endl;
}else {
messageRecv[recv_size] = '\0';
}
cout << "Pesan dari server: " << messageRecv <<endl;
return 0;
}
```
ScrenShot hasil runing program
Berhasil:
server.exe

Client.exe

gagal:
server.exe

Client.exe
