8 #include <netinet/in.h>
11 #include "daq/roisend/util.h"
12 #include "daq/roisend/b2_socket.h"
16 b2_timed_blocking_io(
const int sd,
const int timeout )
26 ret = setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, &tv,
sizeof(
struct timeval));
34 ret = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv,
sizeof(
struct timeval));
39 }
else if (timeout == 0) {
40 ret = fcntl(sd, F_SETFL, O_NDELAY);
45 }
else if (timeout < 0) {
46 ret = fcntl(sd, F_GETFL, O_NDELAY);
52 ret = fcntl(sd, F_SETFL, ret);
65 b2_build_sockaddr_in(
const char* hostname,
const unsigned short port,
struct sockaddr_in* in)
67 memset(in, 0,
sizeof(
struct sockaddr_in));
69 in->sin_family = AF_INET;
71 struct hostent* hoste;
72 hoste = gethostbyname(hostname);
77 in->sin_addr = *(
struct in_addr*)(hoste->h_addr);
79 in->sin_port = htons(port);
87 b2_create_tcp_socket(
void)
92 sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
99 ret = b2_timed_blocking_io(sd, 0);
101 ERROR(b2_timed_blocking_io);
106 ret = setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (
char*)&one,
sizeof(
int));
118 b2_create_accept_socket(
const unsigned short port)
121 struct sockaddr_in in;
124 sd = b2_create_tcp_socket();
126 ERROR(b2_create_tcp_socket);
130 ret = b2_build_sockaddr_in(
"0.0.0.0", port, &in);
132 ERROR(b2_build_sockaddr_in);
136 ret = bind(sd, (
const struct sockaddr*)&in,
sizeof(
struct sockaddr_in));
154 b2_create_connect_socket(
const char* hostname,
const unsigned short port)
157 struct sockaddr_in in;
160 sd = b2_create_tcp_socket();
162 ERROR(b2_create_tcp_socket);
166 ret = b2_build_sockaddr_in(hostname, port, &in);
168 ERROR(b2_build_sockaddr_in);
172 ret = connect(sd, (
const struct sockaddr*)&in,
sizeof(
struct sockaddr_in));
173 if (ret == -1 && errno != EINPROGRESS) {
184 b2_send(
const int sd,
const void* buf,
const size_t size)
186 unsigned char* ptr = (
unsigned char*)buf;
187 size_t n_bytes_remained = size;
191 int ret, n_bytes_send;
193 ret = send(sd, ptr, n_bytes_remained, 0);
194 if (ret == -1 && errno != EINTR) {
198 if (ret == -1 && errno == EINTR) {
199 fprintf(stderr,
"%s:%d: recv(): Packet send timed out\n", __FILE__, __LINE__);
203 fprintf(stderr,
"%s:%d: send(): Connection closed\n", __FILE__, __LINE__);
210 if (n_bytes_remained <
size_t(n_bytes_send))
213 fprintf(stderr,
"%s:%d: send(): Internal error\n", __FILE__, __LINE__);
216 n_bytes_remained -= n_bytes_send;
218 if (n_bytes_remained == 0)
231 b2_recv(
const int sd,
void* buf,
const size_t size)
233 unsigned char* ptr = (
unsigned char*)buf;
234 size_t n_bytes_remained = size;
238 int ret, n_bytes_recv;
240 ret = recv(sd, ptr, n_bytes_remained, 0);
241 if (ret == -1 && (errno != EINTR && errno != EWOULDBLOCK)) {
245 if (ret == -1 && (errno == EINTR || errno == EWOULDBLOCK)) {
246 fprintf(stderr,
"%s:%d: recv(): Packet receive timed out\n", __FILE__, __LINE__);
250 fprintf(stderr,
"%s:%d: recv(): Connection closed\n", __FILE__, __LINE__);
256 if (n_bytes_remained <
size_t(n_bytes_recv))
259 fprintf(stderr,
"%s:%d: recv(): Internal error\n", __FILE__, __LINE__);
262 n_bytes_remained -= n_bytes_recv;
264 if (n_bytes_remained == 0)