changeset 261:a03df7dc98f8

Add xsocket wrappers
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Tue, 16 Jun 2015 15:09:23 +0200
parents 3622e24a443f
children ebbe0f198322
files xsocket.c xsocket.h
diffstat 2 files changed, 183 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xsocket.c	Tue Jun 16 15:09:23 2015 +0200
@@ -0,0 +1,157 @@
+#ifdef _CVI_
+#include <winsock2.h>
+#include <ansi_c.h>
+#define strdup(s) StrDup(s)
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#endif
+
+#include "xsocket.h"
+
+
+struct xsocket * xsocket(const char *hostname, const int port)
+{
+	struct xsocket *s = malloc(sizeof(struct xsocket));
+	if (! s)
+		return NULL;
+	
+	s->hostname = strdup(hostname);
+	s->port = port;
+	s->fd = -1;
+
+	return s;
+}
+
+
+int xconnect(struct xsocket *s)
+{
+	int r, sock;
+	struct sockaddr_in addr;
+	struct hostent* host;	
+
+#ifdef _CVI_
+	WSADATA wsdata;
+	WSAStartup(MAKEWORD(2,2), &wsdata);	
+#endif
+
+	if (s->fd >= 0)
+		return 0;
+
+	host = gethostbyname(s->hostname);
+	if (host == NULL)
+		return -errno;
+	
+	sock = socket(AF_INET, SOCK_STREAM, 0);
+	if (sock < 0)
+		return -errno;
+	
+	addr.sin_family = host->h_addrtype;
+	memcpy(&addr.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
+	addr.sin_port = htons(s->port);
+
+	r = connect(sock, (struct sockaddr*)&addr, sizeof(addr));
+	if (r < 0)
+		return -errno;
+	
+	s->fd = sock;
+	return 0;
+}
+
+
+int xsend(struct xsocket *s, const char *data, size_t len)
+{
+	int r, retry = 2;
+
+	while (--retry) {
+		
+		r = xconnect(s);
+		if (r < 0)
+			return r;
+	
+		r = send(s->fd, data, len, 0);
+		if (r < 0) {
+			close(s->fd);
+			s->fd = -1;
+			continue;
+		}
+
+		break;
+	}
+
+	return (r < 0) ? -errno : 0;
+}
+
+
+int xrecv(struct xsocket *s, char *buffer, size_t len)
+{
+	return recv(s->fd, buffer, len, 0);
+}
+
+
+int msend(struct xsocket *s, const char *data, size_t len)
+{
+	char *buffer = malloc(len + 2);
+	memcpy(buffer, data, len);
+	
+	buffer[len++] = '\r';
+	buffer[len++] = '\n';
+
+	return xsend(s, buffer, len);
+}
+
+
+int mrecv(struct xsocket *s, char *buffer, size_t len)
+{
+	int n;
+
+	n = xrecv(s, buffer, len);
+	if (n < 0)
+		return n;
+
+	if ((buffer[--n] != '\n') || (buffer[--n] != '\r'))
+		return -EINVAL;
+
+	buffer[n] = '\0';
+
+	return n;
+}
+
+
+int command(struct xsocket *s, char *frmt, ...)
+{
+	int r, n;
+	char buffer[1024];
+	va_list v;
+
+	va_start(v, frmt);
+	n = vsnprintf(buffer, sizeof(buffer) - 2, frmt, v);
+	va_end(v);
+
+	buffer[n++] = '\r';
+	buffer[n++] = '\n';
+
+	r = xsend(s, buffer, n);
+	if (r < 0)
+		return r;
+
+	r = mrecv(s, buffer, sizeof(buffer));
+	if (r < 0)
+		return r;
+
+	if (strcmp(buffer, "OK") != 0)
+		return -EINVAL;
+
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xsocket.h	Tue Jun 16 15:09:23 2015 +0200
@@ -0,0 +1,26 @@
+#ifndef __XSOCKET_H__
+#define __XSOCKET_H__
+
+#ifdef _CVI_
+#include <ansi_c.h>
+#else
+#include <stdlib.h>
+#endif
+
+struct xsocket {
+	char *hostname;
+	int port;
+	int fd;
+};
+
+struct xsocket * xsocket(const char *hostname, const int port);
+int xconnect(struct xsocket *s);
+int xsend(struct xsocket *s, const char *data, size_t len);
+int xrecv(struct xsocket *s, char *buffer, size_t len);
+
+int msend(struct xsocket *s, const char *data, size_t len);
+int mrecv(struct xsocket *s, char *buffer, size_t len);
+
+int command(struct xsocket *s, char *frmt, ...);
+
+#endif