25 #include "protobuf-c/protobuf-c.h"
32 #include <sys/types.h>
35 #include <sys/socket.h>
36 #include <netinet/in.h>
37 #include <netinet/tcp.h>
38 #include <sys/select.h>
39 #include <sys/ioctl.h>
40 #include <arpa/inet.h>
50 struct addrinfo hints;
51 struct addrinfo* ai_result = NULL;
52 struct addrinfo* ai = NULL;
53 socket99_result result;
56 socket99_config cfg = {
61 sprintf(port_str,
"%d", port);
64 LOGF1(
"Connecting to %s:%d", host, port);
65 if (!socket99_open(&cfg, &result)) {
67 socket99_snprintf(err_buf, 256, &result);
68 LOGF0(
"Failed to open socket connection with host: %s", err_buf);
73 socket99_set_hints(&cfg, &hints);
74 if (getaddrinfo(cfg.host, port_str, &hints, &ai_result) != 0) {
75 LOGF0(
"Failed to get socket address info: errno %d", errno);
82 for (ai = ai_result; ai != NULL; ai = ai->ai_next) {
83 int setsockopt_result;
86 #if defined(SO_NOSIGPIPE) && !defined(__APPLE__)
91 setsockopt_result = setsockopt(result.fd,
92 SOL_SOCKET, SO_NOSIGPIPE,
93 &enable,
sizeof(enable));
96 if (setsockopt_result != 0 && setsockopt_result != ENOTSOCK) {
97 LOG0(
"Failed to set SO_NOSIGPIPE on socket");
104 setsockopt_result = setsockopt(result.fd,
105 SOL_SOCKET, SO_SNDBUF,
106 &buffer_size,
sizeof(buffer_size));
107 if (setsockopt_result == -1) {
108 LOG0(
"Error setting socket send buffer size");
114 setsockopt_result = setsockopt(result.fd,
115 SOL_SOCKET, SO_RCVBUF,
116 &buffer_size,
sizeof(buffer_size));
117 if (setsockopt_result == -1) {
118 LOG0(
"Error setting socket receive buffer size");
125 freeaddrinfo(ai_result);
129 LOGF0(
"Could not connect to %s:%d", host, port);
133 LOGF1(
"Successfully connected to %s:%d (fd=%d)", host, port, result.fd);
141 LOG1(
"Not connected so no cleanup needed");
144 LOGF0(
"Closing socket with fd=%d", socket);
145 if (close(socket) == 0) {
146 LOG2(
"Socket closed successfully");
149 LOGF0(
"Error closing socket file descriptor!"
150 " (fd=%d, errno=%d, desc='%s')",
151 socket, errno, strerror(errno));
159 setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, &on,
sizeof(on));
164 #if !defined(__APPLE__)
166 setsockopt(socket, IPPROTO_TCP, TCP_CORK, &on,
sizeof(on));
174 #if !defined(__APPLE__)
176 setsockopt(socket, IPPROTO_TCP, TCP_CORK, &off,
sizeof(off));
void KineticSocket_EnableTCPNoDelay(int socket)
#define LOGF1(message,...)
#define KINETIC_OBJ_SIZE
Max object/value size.
void KineticSocket_BeginPacket(int socket)
int KineticSocket_Connect(const char *host, int port)
#define KINETIC_SOCKET_DESCRIPTOR_INVALID
#define LOGF0(message,...)
void KineticSocket_FinishPacket(int socket)
void KineticSocket_Close(int socket)