17#if ETISS_USE_POSIX_SOCKET
22#include <netinet/in.h>
23#include <netinet/tcp.h>
25#include <sys/socket.h>
31#define SOCK_NONBLOCK O_NONBLOCK
36UnixTCPGDBConnection::UnixTCPGDBConnection(
unsigned port)
40 socket_ = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
41 active_valid_ =
false;
46 std::cout <<
"ERROR: failed to create TCP socket (ipv4)" << std::endl;
47 std::cout <<
"\t" << strerror(errno) << std::endl;
51 setsockopt(socket_, IPPROTO_TCP, TCP_NODELAY, (
char *)&flag,
sizeof(
int));
53 setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, (
char *)&flag,
58 struct sockaddr_in addr;
59 addr.sin_family = AF_INET;
60 addr.sin_addr.s_addr = INADDR_ANY;
61 addr.sin_port = htons(port);
62 if (bind(socket_, (
struct sockaddr *)&addr,
sizeof(addr)) < 0)
65 std::cout <<
"ERROR: failed to bind TCP socket (ipv4) to port " << port << std::endl;
66 std::cout <<
"\t" << strerror(errno) << std::endl;
75UnixTCPGDBConnection::~UnixTCPGDBConnection()
82bool UnixTCPGDBConnection::available()
84 return _available(
false);
86bool UnixTCPGDBConnection::_available(
bool block)
90 if (!valid_ && !active_valid_)
93 if (!active_valid_ && valid_)
95 int cur = accept(socket_, 0, 0);
102 setsockopt(cur, IPPROTO_TCP, TCP_NODELAY, (
char *)&flag,
sizeof(
int));
109 int deny = accept(socket_, 0, 0);
115 ssize_t len = recv(active_, (
void *)(buffer_ + buffer_pos_), 1024 - buffer_pos_, block ? 0 : MSG_DONTWAIT);
118 for (
unsigned i = buffer_pos_; i < (unsigned)(buffer_pos_ + len); i++)
120 if (buffer_[i] == 243 || buffer_[i] == 3)
122 for (
int j = i + 1; j < buffer_pos_ + len; j++)
124 buffer_[j - 1] = buffer_[j];
127 pending_break_ =
true;
136 active_valid_ =
false;
138 else if (errno != EAGAIN && errno != EWOULDBLOCK)
140 std::cout <<
"ERROR: gdb socket failed" << std::endl;
141 std::cout <<
"\t" << strerror(errno) << std::endl;
143 active_valid_ =
false;
146 return buffer_pos_ > 0;
148std::string UnixTCPGDBConnection::rcv()
150 if (buffer_pos_ == 0)
155 for (
unsigned i = 0; i < buffer_pos_; i++)
157 ret.push_back((
char)buffer_[i]);
165bool UnixTCPGDBConnection::snd(std::string answer)
171 while (pos < answer.length())
173 ssize_t len = write(active_, answer.c_str() + pos, answer.length() - pos);
176 if (len != EAGAIN && len != EWOULDBLOCK)
179 active_valid_ =
false;