emp-toolkit
net_io_channel.h
Go to the documentation of this file.
1 #include <iostream>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6 #include <arpa/inet.h>
7 #include <sys/types.h>
8 #include <netinet/tcp.h>
9 
10 #include <netinet/in.h>
11 #include <sys/socket.h>
12 #include <string>
13 #include "io_channel.h"
14 using namespace std;
15 
16 #ifndef NETWORK_IO_CHANNEL
17 #define NETWORK_IO_CHANNEL
18 
22 class NetIO: public IOChannel<NetIO> { public:
23  bool is_server;
24  int mysocket = -1;
25  int consocket = -1;
26  FILE * stream = nullptr;
27  char * buffer = nullptr;
28  bool has_sent = false;
29 #ifdef COUNT_IO
30  uint64_t counter = 0;
31 #endif
32  NetIO(const char * address, int port) {
33  is_server = (address == nullptr);
34  if (address == nullptr) {
35  struct sockaddr_in dest;
36  struct sockaddr_in serv;
37  socklen_t socksize = sizeof(struct sockaddr_in);
38  memset(&serv, 0, sizeof(serv));
39  serv.sin_family = AF_INET;
40  serv.sin_addr.s_addr = htonl(INADDR_ANY); /* set our address to any interface */
41  serv.sin_port = htons(port); /* set the server port number */
42  mysocket = socket(AF_INET, SOCK_STREAM, 0);
43  int reuse = 1;
44  setsockopt(mysocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse));
45  bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr));
46  listen(mysocket, 1);
47  consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
48  }
49  else {
50  struct sockaddr_in dest;
51  consocket = socket(AF_INET, SOCK_STREAM, 0);
52  memset(&dest, 0, sizeof(dest));
53  dest.sin_family = AF_INET;
54  dest.sin_addr.s_addr = inet_addr(address);
55  dest.sin_port = htons(port);
56  while(connect(consocket, (struct sockaddr *)&dest, sizeof(struct sockaddr)) == -1) {
57  usleep(1000);
58  }
59  }
60 // set_nodelay();
61  cout << "connected"<<endl;
62  stream = fdopen(consocket, "wb+");
63  buffer = new char[NETWORK_BUFFER_SIZE];
64  memset(buffer, 0, NETWORK_BUFFER_SIZE);
65  setvbuf(stream, buffer, _IOFBF, NETWORK_BUFFER_SIZE);
66  }
67 
68  ~NetIO(){
69  fflush(stream);
70  close(consocket);
71  delete[] buffer;
72  }
73  void sync() {
74  int tmp = 0;
75  if(is_server) {
76  send_data(&tmp, 1);
77  recv_data(&tmp, 1);
78  }else{
79  recv_data(&tmp, 1);
80  send_data(&tmp, 1);
81  flush();
82  }
83  }
84  void set_nodelay(){
85  const int one=1;
86  setsockopt(consocket,IPPROTO_TCP,TCP_NODELAY,&one,sizeof(one));
87  }
88 
89  void set_delay(){
90  const int zero = 0;
91  setsockopt(consocket,IPPROTO_TCP,TCP_NODELAY,&zero,sizeof(zero));
92  }
93 
94  void flush() {
95  fflush(stream);
96  }
97 
98  void send_data_impl(const void * data, int len) {
99 #ifdef COUNT_IO
100  counter +=len;
101 #endif
102  int sent = 0;
103  while(sent < len) {
104  int res = fwrite(sent+(char*)data, 1, len-sent, stream);
105  if (res >= 0)
106  sent+=res;
107  else
108  fprintf(stderr,"error: net_send_data %d\n", res);
109  }
110  has_sent = true;
111  }
112 
113  void recv_data_impl(void * data, int len) {
114 #ifdef COUNT_IO
115  counter +=len;
116 #endif
117  if(has_sent)
118  fflush(stream);
119  has_sent = false;
120  int sent = 0;
121  while(sent < len) {
122  int res = fread(sent+(char*)data, 1, len-sent, stream);
123  if (res >= 0)
124  sent+=res;
125  else
126  fprintf(stderr,"error: net_send_data %d\n", res);
127  }
128  }
129 };
131 #endif//NETWORK_IO_CHANNEL
#define NETWORK_BUFFER_SIZE
Definition: config.h:7
void flush()
Definition: net_io_channel.h:94
Definition: net_io_channel.h:22
NetIO(const char *address, int port)
Definition: net_io_channel.h:32
void send_data_impl(const void *data, int len)
Definition: net_io_channel.h:98
bool is_server
Definition: net_io_channel.h:23
int port
Definition: input-check-malicious.cpp:12
void recv_data_impl(void *data, int len)
Definition: net_io_channel.h:113
void set_delay()
Definition: net_io_channel.h:89
void sync()
Definition: net_io_channel.h:73
Definition: io_channel.h:12
void set_nodelay()
Definition: net_io_channel.h:84
~NetIO()
Definition: net_io_channel.h:68