commit
072c0e141c
@ -0,0 +1,5 @@ |
||||
{ |
||||
"files.associations": { |
||||
"functional": "cpp" |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
#ifndef _IP_ |
||||
#define _IP_ |
||||
|
||||
#include <iostream> |
||||
#include <string> |
||||
#include <string.h> |
||||
#include <arpa/inet.h> |
||||
#include <netdb.h> |
||||
#include <unistd.h> |
||||
|
||||
using namespace std; |
||||
|
||||
bool isIPAddress(const string address); |
||||
bool isIPv4 (const string address); |
||||
bool isIPv6 (const string address); |
||||
string ipFromDomain(const string domain);
|
||||
|
||||
|
||||
|
||||
#endif |
@ -0,0 +1,56 @@ |
||||
#ifndef TCP_SCK |
||||
#define TCP_SCK |
||||
|
||||
#include <iostream> |
||||
#include <string> |
||||
#include <string.h> |
||||
#include <arpa/inet.h> |
||||
#include <netdb.h> |
||||
#include <unistd.h> |
||||
|
||||
#include "ip.hpp" |
||||
|
||||
using namespace std; |
||||
|
||||
class server { |
||||
public: |
||||
int sock; |
||||
struct sockaddr_in addr; |
||||
|
||||
server (const ushort port, const uint limit = 1000); |
||||
~server (); |
||||
|
||||
|
||||
}; |
||||
|
||||
|
||||
class client { |
||||
public: |
||||
int sock; |
||||
struct sockaddr_in addr; |
||||
|
||||
client (const string address, const ushort port); |
||||
~client (); |
||||
bool tell (const string msg); |
||||
string obey (size_t byte_limit = 1024); |
||||
}; |
||||
|
||||
|
||||
class comming { |
||||
public: |
||||
const server *srv; |
||||
int conn; |
||||
string ipv4; |
||||
string ipv6; |
||||
|
||||
comming(const server *_srv, const uint timeout); |
||||
~comming(); |
||||
bool tell (const string msg); |
||||
string obey (size_t byte_limit = 1024); |
||||
|
||||
}; |
||||
|
||||
|
||||
|
||||
|
||||
#endif |
@ -0,0 +1,35 @@ |
||||
#include "../lib/ip.hpp" |
||||
|
||||
|
||||
bool isIPAddress(const string address) { |
||||
char buf[16]; |
||||
return isIPv4(address) || isIPv6(address) ; |
||||
} |
||||
|
||||
bool isIPv4 (const string address) { |
||||
char buf[16]; |
||||
return inet_pton(AF_INET, address.c_str(), buf); |
||||
} |
||||
|
||||
bool isIPv6 (const string address) { |
||||
char buf[16]; |
||||
return inet_pton(AF_INET6, address.c_str(), buf); |
||||
} |
||||
|
||||
string ipFromDomain(const string domain) {
|
||||
struct hostent *host_name;
|
||||
struct in_addr **ipaddress;
|
||||
int i;
|
||||
char ip_address[INET6_ADDRSTRLEN]; |
||||
|
||||
if((host_name = gethostbyname(domain.c_str())) == NULL) {
|
||||
printf ("[ERROR] IP Address Not Found from domain!"); |
||||
}
|
||||
|
||||
ipaddress = (struct in_addr **) host_name->h_addr_list; |
||||
for(i = 0; ipaddress[i] != NULL; i++) {
|
||||
strcpy(ip_address, inet_ntoa(*ipaddress[i])); |
||||
} |
||||
|
||||
return (string) ip_address; |
||||
} |
@ -0,0 +1,128 @@ |
||||
#include "../lib/tcp_socket.hpp" |
||||
|
||||
server::server (const ushort port, const uint limit) { |
||||
|
||||
addr.sin_family = AF_INET; |
||||
addr.sin_addr.s_addr = INADDR_ANY; |
||||
addr.sin_port = htons(port); |
||||
|
||||
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (sock <= 0) {
|
||||
printf("[ERROR] Ne mogu otvoriti defenirani TCP/IP socket!"); |
||||
} |
||||
|
||||
int opt=1; |
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { |
||||
printf("[ERROR] Ne mogu otvoriti defenirani TCP/IP socket!"); |
||||
} |
||||
printf("[EVENT] Otvoren defenirani TCP/IP socket."); |
||||
|
||||
if (bind(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { |
||||
printf("[ERROR] Ne mogu bindati defenirani TCP/IP socket!"); |
||||
} |
||||
|
||||
if (listen(sock, limit) < 0) { |
||||
printf("[ERROR] Ne mogu defenirani listen za TCP/IP socket!"); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
server::~server () { |
||||
|
||||
if (sock<0) { |
||||
printf ("[ERROR] Soket destruktor: već zatvoren soket!"); |
||||
} |
||||
|
||||
else if (!close(sock)) { |
||||
printf ("[ERROR] Soket destruktor nije mogao zatvoriti soket!"); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
client::client(const string address, const ushort port) { |
||||
|
||||
sock = socket(AF_INET, SOCK_STREAM, 0); |
||||
if (sock < 0) { |
||||
printf("[ERROR] Ne mogu otvoriti TCP/IP socket!"); |
||||
} |
||||
|
||||
const string _address = isIPAddress(address) ? address : ipFromDomain(address); |
||||
|
||||
addr.sin_family = AF_INET; |
||||
addr.sin_addr.s_addr = inet_addr(_address.c_str()); |
||||
addr.sin_port = htons(port); |
||||
|
||||
if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) != 0) { |
||||
printf("[EROR] Ne mogu se povezati s poslužiteljem!"); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
client::~client () { |
||||
|
||||
if (sock <= 0) { |
||||
printf ("[ERROR] Soket destruktor: već zatvoren soket!"); |
||||
} |
||||
|
||||
else if (close(sock) != 0) { |
||||
printf ("[ERROR] Soket destruktor nije mogao zatvoriti soket!"); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
bool client::tell (const string msg) { |
||||
ssize_t sended = send(sock, msg.c_str(), msg.length(),0); |
||||
return sended == msg.length(); |
||||
} |
||||
|
||||
string client::obey (size_t byte_limit) { |
||||
char res[byte_limit] = {0}; |
||||
ssize_t n = read ( sock , res, byte_limit); |
||||
return (string) res; |
||||
} |
||||
|
||||
|
||||
|
||||
comming::comming(const server *_srv, const uint timeout) { |
||||
srv = _srv; |
||||
socklen_t len = sizeof(struct sockaddr_in); |
||||
|
||||
if ((conn = accept(srv->sock, (struct sockaddr *)&(srv->addr), (socklen_t*)&len)) < 0) { |
||||
printf("[ERROR] Ne mogu preuzeti vezu klijenta!"); |
||||
} |
||||
|
||||
char ipv4_buff[INET_ADDRSTRLEN]; |
||||
char ipv6_buff[INET6_ADDRSTRLEN]; |
||||
|
||||
inet_ntop(AF_INET, &(srv->addr.sin_addr), ipv4_buff, INET_ADDRSTRLEN); |
||||
ipv4 = ipv4_buff; |
||||
inet_ntop(AF_INET6, &(srv->addr.sin_addr), ipv6_buff, INET6_ADDRSTRLEN); |
||||
ipv6 = ipv6_buff; |
||||
|
||||
|
||||
} |
||||
|
||||
comming::~comming() { |
||||
if (conn <= 0) { |
||||
printf ("[ERROR] Comming destruktor: već zatvoren soket!"); |
||||
} |
||||
|
||||
else if (close(conn) != 0) { |
||||
printf ("[ERROR] Comming destruktor nije mogao zatvoriti soket!"); |
||||
} |
||||
} |
||||
|
||||
bool comming::tell (const string msg) { |
||||
ssize_t sended = send(conn, msg.c_str(), msg.length(),0); |
||||
return sended == msg.length(); |
||||
} |
||||
|
||||
string comming::obey (size_t byte_limit) { |
||||
char res[byte_limit] = {0}; |
||||
ssize_t n = read ( conn , res, byte_limit); |
||||
return (string) res; |
||||
} |
@ -0,0 +1,15 @@ |
||||
#include <iostream> |
||||
|
||||
#include "../lib/tcp_socket.hpp" |
||||
|
||||
using namespace std; |
||||
|
||||
int main() { |
||||
|
||||
client myserver("localhost", 5000); |
||||
string sends = "Hello wld!"; |
||||
cout << myserver.tell(sends) << " " << sends.length() << endl; |
||||
cout << myserver.obey(); |
||||
|
||||
return 0; |
||||
} |
Binary file not shown.
@ -0,0 +1 @@ |
||||
g++ client.cpp ../src/* -o client.o |
@ -0,0 +1 @@ |
||||
g++ server.cpp ../src/* -o server.o |
@ -0,0 +1,27 @@ |
||||
#include <iostream> |
||||
|
||||
#include "../lib/tcp_socket.hpp" |
||||
|
||||
using namespace std; |
||||
|
||||
int main() { |
||||
|
||||
server myserver(5000, 10); |
||||
comming myclient(&myserver, 1000); |
||||
|
||||
string fromclient = myclient.obey(); |
||||
myclient.tell(fromclient); |
||||
myclient.~comming(); |
||||
|
||||
while (true) { |
||||
comming myclient(&myserver, 1000); |
||||
string fromclient = myclient.obey(); |
||||
cout << fromclient << " " << myclient.conn << endl; |
||||
cout << "Poslano: " << myclient.tell(fromclient) << "Veličin: " << fromclient.length() << endl; |
||||
// myclient.~comming();
|
||||
cout << "IPv4 " << myclient.ipv4 << " ipv6 " << myclient.ipv6; |
||||
} |
||||
|
||||
|
||||
return 0; |
||||
} |
Binary file not shown.
Loading…
Reference in new issue