-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathoob.c
More file actions
147 lines (123 loc) · 3.91 KB
/
oob.c
File metadata and controls
147 lines (123 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
* Copyright 2014 Simon Pickartz,
* 2020-2022 Niklas Eiling
* 2021-2022 Laura Fuentes Grau
* Instiute for Automation of Complex Power Systems,
* RWTH Aachen University
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <string.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <unistd.h>
#include "oob.h"
int oob_init_listener(oob_t *oob, uint16_t port)
{
struct sockaddr_in addr = {0};
struct sockaddr_in peer_addr = {0};
size_t peer_addr_len = 0;
if (oob == NULL) return 1;
memset(oob, 0, sizeof(oob_t));
if((oob->server_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("oob: creating server socket failed.\n");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
/* Allow port reuse */
int sockopt = 1;
setsockopt(oob->server_socket, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(int));
bind(oob->server_socket, (struct sockaddr*)&addr, sizeof(addr));
listen(oob->server_socket, 10);
peer_addr_len = sizeof(struct sockaddr_in);
if ((oob->socket = accept(oob->server_socket, (struct sockaddr *)&peer_addr, (socklen_t*)&peer_addr_len)) < 0) {
printf("oob: accept failed.\n");
return 1;
}
if (inet_ntop(AF_INET, (const void*)&peer_addr.sin_addr, oob->peer_address, INET_ADDRSTRLEN) == NULL) {
printf("oob: inet_ntop failed\n");
return 1;
}
return 0;
}
int oob_init_sender(oob_t *oob, const char* address, uint16_t port)
{
struct sockaddr_in addr = {0};
struct hostent *hp;
if (oob == NULL) return 1;
memset(oob, 0, sizeof(oob_t));
if((oob->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("oob: creating server socket failed.\n");
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if ((hp = gethostbyname(address)) == 0) {
printf("error resolving hostname: %s\n", address);
return 1;
}
addr.sin_addr = *(struct in_addr*)hp->h_addr;
if (connect(oob->socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
printf("oob: connect failed\n");
return 1;
}
if (inet_ntop(AF_INET, (const void*)&hp->h_addr, oob->peer_address, INET_ADDRSTRLEN) == NULL) {
printf("oob: inet_ntop failed\n");
return 1;
}
return 0;
}
int oob_send(oob_t *oob, void* buffer, size_t len)
{
size_t bytes_sent = 0;
if (oob == NULL || buffer == NULL) return 1;
while(bytes_sent < len) {
bytes_sent += send(oob->socket, (void*)((uint64_t)buffer+bytes_sent), len-bytes_sent, 0);
}
return bytes_sent;
}
int oob_receive(oob_t *oob, void *buffer, size_t len)
{
size_t bytes_received = 0;
while(bytes_received < len) {
bytes_received += recv(oob->socket, (void*)((uint64_t)buffer+bytes_received), len-bytes_received, 0);
}
return bytes_received;
}
int oob_synchronize(oob_t *oob)
{
return 0;
}
int oob_close(oob_t *oob)
{
int ret = 0;
if (oob == NULL) {
return ret;
}
if (close(oob->socket) != 0) {
printf("error closing socket: %s\n", strerror(errno));
ret = 1;
}
if (oob->server_socket) {
if (close(oob->server_socket) != 0) {
printf("error closing socket: %s\n", strerror(errno));
ret = 1;
}
}
return ret;
}