1
1
#ifndef EMP_HIGHSPEED_NETWORK_IO_CHANNEL_H__
2
2
#define EMP_HIGHSPEED_NETWORK_IO_CHANNEL_H__
3
3
4
- #include < iostream>
5
4
#include < stdio.h>
6
5
#include < stdlib.h>
7
6
#include < string.h>
7
+
8
+ #include < iostream>
8
9
#include < string>
10
+
9
11
#include " emp-tool/io/io_channel.h"
10
12
using std::string;
11
13
12
- #include < unistd.h>
13
14
#include < arpa/inet.h>
14
- #include < sys/types.h>
15
- #include < netinet/tcp.h>
16
15
#include < netinet/in.h>
16
+ #include < netinet/tcp.h>
17
17
#include < sys/socket.h>
18
+ #include < sys/types.h>
19
+ #include < unistd.h>
18
20
19
21
namespace emp {
20
22
21
- class SubChannel {
22
- public:
23
+ class SubChannel { public:
23
24
int sock;
24
- FILE * stream = nullptr ;
25
- char * buf = nullptr ;
25
+ FILE *stream = nullptr ;
26
+ char *buf = nullptr ;
26
27
int ptr;
27
- char * stream_buf = nullptr ;
28
+ char *stream_buf = nullptr ;
28
29
uint64_t counter = 0 ;
29
30
uint64_t flushes = 0 ;
30
- SubChannel (int sock): sock(sock) {
31
+ SubChannel (int sock) : sock(sock) {
31
32
stream_buf = new char [NETWORK_BUFFER_SIZE];
32
33
buf = new char [NETWORK_BUFFER_SIZE2];
33
34
stream = fdopen (sock, " wb+" );
@@ -41,65 +42,61 @@ class SubChannel {
41
42
}
42
43
};
43
44
44
- class SenderSubChannel : public SubChannel {public:
45
- SenderSubChannel (int sock): SubChannel(sock) {
46
- ptr = 0 ;
47
- }
48
-
45
+ class SenderSubChannel : public SubChannel { public:
46
+ SenderSubChannel (int sock) : SubChannel(sock) { ptr = 0 ; }
47
+
49
48
void flush () {
50
49
flushes++;
51
50
send_data_raw (buf, ptr);
52
51
if (counter % NETWORK_BUFFER_SIZE2 != 0 )
53
- send_data_raw (buf+ ptr, NETWORK_BUFFER_SIZE2 - counter % NETWORK_BUFFER_SIZE2);
52
+ send_data_raw (buf + ptr, NETWORK_BUFFER_SIZE2 - counter % NETWORK_BUFFER_SIZE2);
54
53
fflush (stream);
55
54
ptr = 0 ;
56
55
}
57
56
58
- void send_data (const void * data, int len) {
57
+ void send_data (const void *data, int len) {
59
58
if (len <= NETWORK_BUFFER_SIZE2 - ptr) {
60
59
memcpy (buf + ptr, data, len);
61
- ptr +=len;
60
+ ptr += len;
62
61
} else {
63
62
send_data_raw (buf, ptr);
64
63
send_data_raw (data, len);
65
64
ptr = 0 ;
66
65
}
67
66
}
68
67
69
- void send_data_raw (const void * data, int len) {
68
+ void send_data_raw (const void *data, int len) {
70
69
counter += len;
71
70
int sent = 0 ;
72
- while (sent < len) {
73
- int res = fwrite (sent + (char *)data, 1 , len - sent, stream);
71
+ while (sent < len) {
72
+ int res = fwrite (sent + (char *)data, 1 , len - sent, stream);
74
73
if (res >= 0 )
75
- sent+= res;
74
+ sent += res;
76
75
else
77
- fprintf (stderr," error: net_send_data %d\n " , res);
76
+ fprintf (stderr, " error: net_send_data %d\n " , res);
78
77
}
79
78
}
80
79
};
81
80
82
- class RecverSubChannel : public SubChannel {public:
83
- RecverSubChannel (int sock): SubChannel(sock) {
84
- ptr = NETWORK_BUFFER_SIZE2;
85
- }
81
+ class RecverSubChannel : public SubChannel { public:
82
+ RecverSubChannel (int sock) : SubChannel(sock) { ptr = NETWORK_BUFFER_SIZE2; }
86
83
void flush () {
87
84
flushes++;
88
85
ptr = NETWORK_BUFFER_SIZE2;
89
86
}
90
87
91
- void recv_data (void * data, int len) {
92
- if (len <= NETWORK_BUFFER_SIZE2 - ptr) {
88
+ void recv_data (void *data, int len) {
89
+ if (len <= NETWORK_BUFFER_SIZE2 - ptr) {
93
90
memcpy (data, buf + ptr, len);
94
91
ptr += len;
95
92
} else {
96
93
int remain = len;
97
94
memcpy (data, buf + ptr, NETWORK_BUFFER_SIZE2 - ptr);
98
- remain -=NETWORK_BUFFER_SIZE2 - ptr;
95
+ remain -= NETWORK_BUFFER_SIZE2 - ptr;
99
96
100
- while (true ) {
97
+ while (true ) {
101
98
recv_data_raw (buf, NETWORK_BUFFER_SIZE2);
102
- if (remain <= NETWORK_BUFFER_SIZE2) {
99
+ if (remain <= NETWORK_BUFFER_SIZE2) {
103
100
memcpy (len - remain + (char *)data, buf, remain);
104
101
ptr = remain;
105
102
break ;
@@ -111,27 +108,45 @@ class RecverSubChannel: public SubChannel {public:
111
108
}
112
109
}
113
110
114
- void recv_data_raw (void * data, int len) {
115
- counter+= len;
111
+ void recv_data_raw (void * data, int len) {
112
+ counter += len;
116
113
int sent = 0 ;
117
- while (sent < len) {
118
- int res = fread (sent + (char *)data, 1 , len - sent, stream);
114
+ while (sent < len) {
115
+ int res = fread (sent + (char *)data, 1 , len - sent, stream);
119
116
if (res >= 0 )
120
117
sent += res;
121
- else
122
- fprintf (stderr," error: net_send_data %d\n " , res);
118
+ else
119
+ fprintf (stderr, " error: net_send_data %d\n " , res);
123
120
}
124
121
}
125
122
};
126
- class HighSpeedNetIO : public IOChannel <HighSpeedNetIO> { public:
123
+
124
+ class HighSpeedNetIO : public IOChannel <HighSpeedNetIO> { public:
127
125
bool is_server, quiet;
128
126
int send_sock = 0 ;
129
127
int recv_sock = 0 ;
130
128
int FSM = 0 ;
131
- SenderSubChannel * schannel;
132
- RecverSubChannel * rchannel;
133
- string addr;
134
- int port;
129
+ SenderSubChannel *schannel;
130
+ RecverSubChannel *rchannel;
131
+
132
+ HighSpeedNetIO (const char *address, int send_port, int recv_port, bool quiet = true ) : quiet(quiet) {
133
+ is_server = (address == nullptr );
134
+ if (is_server) {
135
+ recv_sock = server_listen (send_port);
136
+ usleep (2000 );
137
+ send_sock = server_listen (recv_port & 0xFFFF );
138
+ } else {
139
+ send_sock = client_connect (address, send_port);
140
+ recv_sock = client_connect (address, recv_port & 0xFFFF );
141
+ }
142
+ FSM = 0 ;
143
+ set_delay_opt (send_sock, true );
144
+ set_delay_opt (recv_sock, true );
145
+ schannel = new SenderSubChannel (send_sock);
146
+ rchannel = new RecverSubChannel (recv_sock);
147
+ if (not quiet) std::cout << " connected\n " ;
148
+ }
149
+
135
150
int server_listen (int port) {
136
151
int mysocket;
137
152
struct sockaddr_in dest;
@@ -140,81 +155,58 @@ class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
140
155
memset (&serv, 0 , sizeof (serv));
141
156
serv.sin_family = AF_INET;
142
157
serv.sin_addr .s_addr = htonl (INADDR_ANY); /* set our address to any interface */
143
- serv.sin_port = htons (port); /* set the server port number */
158
+ serv.sin_port = htons (port); /* set the server port number */
144
159
mysocket = socket (AF_INET, SOCK_STREAM, 0 );
145
160
int reuse = 1 ;
146
- setsockopt (mysocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof (reuse));
147
- if (bind (mysocket, (struct sockaddr *)&serv, sizeof (struct sockaddr )) < 0 ) {
161
+ setsockopt (mysocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&reuse, sizeof (reuse));
162
+ if (bind (mysocket, (struct sockaddr *)&serv, sizeof (struct sockaddr )) < 0 ) {
148
163
perror (" error: bind" );
149
164
exit (1 );
150
165
}
151
- if (listen (mysocket, 1 ) < 0 ) {
166
+ if (listen (mysocket, 1 ) < 0 ) {
152
167
perror (" error: listen" );
153
168
exit (1 );
154
169
}
155
170
int sock = accept (mysocket, (struct sockaddr *)&dest, &socksize);
156
171
close (mysocket);
157
172
return sock;
158
173
}
159
- int client_connect (const char * address, int port) {
174
+ int client_connect (const char *address, int port) {
160
175
int sock;
161
176
struct sockaddr_in dest;
162
177
memset (&dest, 0 , sizeof (dest));
163
178
dest.sin_family = AF_INET;
164
179
dest.sin_addr .s_addr = inet_addr (address);
165
180
dest.sin_port = htons (port);
166
181
167
- while (1 ) {
182
+ while (1 ) {
168
183
sock = socket (AF_INET, SOCK_STREAM, 0 );
169
- if (connect (sock, (struct sockaddr *)&dest, sizeof (struct sockaddr )) == 0 )
170
- break ;
171
-
184
+ if (connect (sock, (struct sockaddr *)&dest, sizeof (struct sockaddr )) == 0 ) break ;
185
+
172
186
close (sock);
173
187
usleep (1000 );
174
188
}
175
189
return sock;
176
-
177
- }
178
- HighSpeedNetIO (const char * address, int port, bool quiet = true ): quiet(quiet), port(port & 0xFFFF ) {
179
- is_server = (address == nullptr );
180
- if (is_server) {
181
- recv_sock = server_listen (port);
182
- usleep (2000 );
183
- send_sock = server_listen ((port+1 )&0xFFFF );
184
- }
185
- else {
186
- addr = string (address);
187
- send_sock = client_connect (address, port);
188
- recv_sock = client_connect (address, (port+1 )&0xFFFF );
189
- }
190
- FSM = 0 ;
191
- set_delay_opt (send_sock, true );
192
- set_delay_opt (recv_sock, true );
193
- schannel = new SenderSubChannel (send_sock);
194
- rchannel = new RecverSubChannel (recv_sock);
195
- if (not quiet)
196
- std::cout << " connected\n " ;
197
190
}
198
191
199
192
~HighSpeedNetIO () {
200
193
flush ();
201
- if (not quiet) {
202
- std::cout <<" Data Sent: \t " << schannel->counter << " \n " ;
203
- std::cout <<" Data Received: \t " << rchannel->counter << " \n " ;
204
- std::cout <<" Flushes:\t " << schannel->flushes << " \t " << rchannel->flushes << " \n " ;
194
+ if (not quiet) {
195
+ std::cout << " Data Sent: \t " << schannel->counter << " \n " ;
196
+ std::cout << " Data Received: \t " << rchannel->counter << " \n " ;
197
+ std::cout << " Flushes:\t " << schannel->flushes << " \t " << rchannel->flushes << " \n " ;
205
198
}
206
199
delete schannel;
207
200
delete rchannel;
208
201
close (send_sock);
209
202
close (recv_sock);
210
203
}
211
204
212
- void sync () {
213
- }
205
+ void sync () {}
214
206
215
207
void set_delay_opt (int sock, bool enable_nodelay) {
216
208
if (enable_nodelay) {
217
- const int one= 1 ;
209
+ const int one = 1 ;
218
210
setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof (one));
219
211
} else {
220
212
const int zero = 0 ;
@@ -223,7 +215,7 @@ class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
223
215
}
224
216
225
217
void flush () {
226
- if (is_server) {
218
+ if (is_server) {
227
219
schannel->flush ();
228
220
rchannel->flush ();
229
221
} else {
@@ -232,22 +224,23 @@ class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
232
224
}
233
225
FSM = 0 ;
234
226
}
235
-
236
- void send_data_internal (const void * data, int len) {
237
- if (FSM == 1 ) {
227
+
228
+ void send_data_internal (const void *data, int len) {
229
+ if (FSM == 1 ) {
238
230
rchannel->flush ();
239
231
}
240
232
schannel->send_data (data, len);
241
233
FSM = 2 ;
242
234
}
243
- void recv_data_internal (void * data, int len) {
244
- if (FSM == 2 ) {
235
+
236
+ void recv_data_internal (void *data, int len) {
237
+ if (FSM == 2 ) {
245
238
schannel->flush ();
246
239
}
247
240
rchannel->recv_data (data, len);
248
241
FSM = 1 ;
249
242
}
250
243
};
251
244
252
- }
245
+ } // namespace emp
253
246
#endif
0 commit comments