Skip to content

Commit fa237b7

Browse files
Update HighSpeedNetIO to take in two ports instead of one (#119)
* Update HighSpeedNetIO to take in two ports instead of one * Remove unused variables * revert some formatting change Co-authored-by: Xiao Wang <[email protected]>
1 parent ef6b235 commit fa237b7

File tree

3 files changed

+104
-110
lines changed

3 files changed

+104
-110
lines changed
+80-87
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
#ifndef EMP_HIGHSPEED_NETWORK_IO_CHANNEL_H__
22
#define EMP_HIGHSPEED_NETWORK_IO_CHANNEL_H__
33

4-
#include <iostream>
54
#include <stdio.h>
65
#include <stdlib.h>
76
#include <string.h>
7+
8+
#include <iostream>
89
#include <string>
10+
911
#include "emp-tool/io/io_channel.h"
1012
using std::string;
1113

12-
#include <unistd.h>
1314
#include <arpa/inet.h>
14-
#include <sys/types.h>
15-
#include <netinet/tcp.h>
1615
#include <netinet/in.h>
16+
#include <netinet/tcp.h>
1717
#include <sys/socket.h>
18+
#include <sys/types.h>
19+
#include <unistd.h>
1820

1921
namespace emp {
2022

21-
class SubChannel {
22-
public:
23+
class SubChannel { public:
2324
int sock;
24-
FILE * stream = nullptr;
25-
char * buf = nullptr;
25+
FILE *stream = nullptr;
26+
char *buf = nullptr;
2627
int ptr;
27-
char * stream_buf = nullptr;
28+
char *stream_buf = nullptr;
2829
uint64_t counter = 0;
2930
uint64_t flushes = 0;
30-
SubChannel (int sock): sock(sock) {
31+
SubChannel(int sock) : sock(sock) {
3132
stream_buf = new char[NETWORK_BUFFER_SIZE];
3233
buf = new char[NETWORK_BUFFER_SIZE2];
3334
stream = fdopen(sock, "wb+");
@@ -41,65 +42,61 @@ class SubChannel {
4142
}
4243
};
4344

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+
4948
void flush() {
5049
flushes++;
5150
send_data_raw(buf, ptr);
5251
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);
5453
fflush(stream);
5554
ptr = 0;
5655
}
5756

58-
void send_data(const void * data, int len) {
57+
void send_data(const void *data, int len) {
5958
if (len <= NETWORK_BUFFER_SIZE2 - ptr) {
6059
memcpy(buf + ptr, data, len);
61-
ptr +=len;
60+
ptr += len;
6261
} else {
6362
send_data_raw(buf, ptr);
6463
send_data_raw(data, len);
6564
ptr = 0;
6665
}
6766
}
6867

69-
void send_data_raw(const void * data, int len) {
68+
void send_data_raw(const void *data, int len) {
7069
counter += len;
7170
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);
7473
if (res >= 0)
75-
sent+=res;
74+
sent += res;
7675
else
77-
fprintf(stderr,"error: net_send_data %d\n", res);
76+
fprintf(stderr, "error: net_send_data %d\n", res);
7877
}
7978
}
8079
};
8180

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; }
8683
void flush() {
8784
flushes++;
8885
ptr = NETWORK_BUFFER_SIZE2;
8986
}
9087

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) {
9390
memcpy(data, buf + ptr, len);
9491
ptr += len;
9592
} else {
9693
int remain = len;
9794
memcpy(data, buf + ptr, NETWORK_BUFFER_SIZE2 - ptr);
98-
remain -=NETWORK_BUFFER_SIZE2 - ptr;
95+
remain -= NETWORK_BUFFER_SIZE2 - ptr;
9996

100-
while(true) {
97+
while (true) {
10198
recv_data_raw(buf, NETWORK_BUFFER_SIZE2);
102-
if(remain <= NETWORK_BUFFER_SIZE2) {
99+
if (remain <= NETWORK_BUFFER_SIZE2) {
103100
memcpy(len - remain + (char *)data, buf, remain);
104101
ptr = remain;
105102
break;
@@ -111,27 +108,45 @@ class RecverSubChannel: public SubChannel {public:
111108
}
112109
}
113110

114-
void recv_data_raw(void * data, int len) {
115-
counter+=len;
111+
void recv_data_raw(void *data, int len) {
112+
counter += len;
116113
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);
119116
if (res >= 0)
120117
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);
123120
}
124121
}
125122
};
126-
class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
123+
124+
class HighSpeedNetIO : public IOChannel<HighSpeedNetIO> { public:
127125
bool is_server, quiet;
128126
int send_sock = 0;
129127
int recv_sock = 0;
130128
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+
135150
int server_listen(int port) {
136151
int mysocket;
137152
struct sockaddr_in dest;
@@ -140,81 +155,58 @@ class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
140155
memset(&serv, 0, sizeof(serv));
141156
serv.sin_family = AF_INET;
142157
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 */
144159
mysocket = socket(AF_INET, SOCK_STREAM, 0);
145160
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) {
148163
perror("error: bind");
149164
exit(1);
150165
}
151-
if(listen(mysocket, 1) < 0) {
166+
if (listen(mysocket, 1) < 0) {
152167
perror("error: listen");
153168
exit(1);
154169
}
155170
int sock = accept(mysocket, (struct sockaddr *)&dest, &socksize);
156171
close(mysocket);
157172
return sock;
158173
}
159-
int client_connect(const char * address, int port) {
174+
int client_connect(const char *address, int port) {
160175
int sock;
161176
struct sockaddr_in dest;
162177
memset(&dest, 0, sizeof(dest));
163178
dest.sin_family = AF_INET;
164179
dest.sin_addr.s_addr = inet_addr(address);
165180
dest.sin_port = htons(port);
166181

167-
while(1) {
182+
while (1) {
168183
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+
172186
close(sock);
173187
usleep(1000);
174188
}
175189
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";
197190
}
198191

199192
~HighSpeedNetIO() {
200193
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";
205198
}
206199
delete schannel;
207200
delete rchannel;
208201
close(send_sock);
209202
close(recv_sock);
210203
}
211204

212-
void sync() {
213-
}
205+
void sync() {}
214206

215207
void set_delay_opt(int sock, bool enable_nodelay) {
216208
if (enable_nodelay) {
217-
const int one=1;
209+
const int one = 1;
218210
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
219211
} else {
220212
const int zero = 0;
@@ -223,7 +215,7 @@ class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
223215
}
224216

225217
void flush() {
226-
if(is_server) {
218+
if (is_server) {
227219
schannel->flush();
228220
rchannel->flush();
229221
} else {
@@ -232,22 +224,23 @@ class HighSpeedNetIO: public IOChannel<HighSpeedNetIO> { public:
232224
}
233225
FSM = 0;
234226
}
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) {
238230
rchannel->flush();
239231
}
240232
schannel->send_data(data, len);
241233
FSM = 2;
242234
}
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) {
245238
schannel->flush();
246239
}
247240
rchannel->recv_data(data, len);
248241
FSM = 1;
249242
}
250243
};
251244

252-
}
245+
} // namespace emp
253246
#endif

0 commit comments

Comments
 (0)