mirror of
https://github.com/nasa/trick.git
synced 2024-12-30 09:58:53 +00:00
61 lines
1.8 KiB
C++
61 lines
1.8 KiB
C++
#include "Socket.hh"
|
|
|
|
#define SOCKET_BUF_SIZE 20480
|
|
|
|
Socket::Socket() : _initialized(false) {}
|
|
|
|
int Socket::init (std::string hostname, int port) {
|
|
_hostname = hostname;
|
|
_port = port;
|
|
_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (_socket_fd < 0) {
|
|
std::cout << "Socket connection failed" << std::endl;
|
|
return -1;
|
|
}
|
|
|
|
struct sockaddr_in serv_addr;
|
|
serv_addr.sin_family = AF_INET;
|
|
serv_addr.sin_port = htons(port); // convert to weird network byte format
|
|
|
|
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
|
|
std::cout << "Invalid address/ Address not supported" << std::endl;
|
|
return -1;
|
|
}
|
|
|
|
if (connect(_socket_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
|
|
std::cout << "Connection failed" << std::endl;
|
|
return -1;
|
|
}
|
|
|
|
_initialized = true;
|
|
}
|
|
|
|
int Socket::send (std::string message) {
|
|
// weird syntax I've never used before - since the send syscall that i'm trying to use is overloaded in this class,
|
|
// I have to append :: to the front of it so that the compiler knows to look in the global namespace
|
|
int success = ::send(_socket_fd, message.c_str(), message.size(), 0);
|
|
if (success < message.size()) {
|
|
std::cout << "Failed to send message" << std::endl;
|
|
}
|
|
return success;
|
|
}
|
|
|
|
int Socket::operator<< (std::string message) {
|
|
return send(message);
|
|
}
|
|
|
|
std::string Socket::receive () {
|
|
char buffer[SOCKET_BUF_SIZE];
|
|
int numBytes = read(_socket_fd, buffer, SOCKET_BUF_SIZE);
|
|
if (numBytes < 0) {
|
|
std::cout << "Failed to read from socket" << std::endl;
|
|
} else if (numBytes < SOCKET_BUF_SIZE) {
|
|
buffer[numBytes] = '\0';
|
|
}
|
|
|
|
return std::string(buffer);
|
|
}
|
|
|
|
void Socket::operator>> (std::string& ret) {
|
|
ret = receive();
|
|
} |