#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> char *def_host = "localhost"; char *def_port = "9999"; char abuf[INET6_ADDRSTRLEN]; int get_sock_fd(char* host, char* service) { struct addrinfo hints; struct addrinfo *result, *rp; char *hst, *prt; int sock; int err; hst = host; if (!hst) hst = def_host; prt = service; if (!prt) prt = def_port; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; printf("Resolving [%s]:%s... ", hst, prt); fflush(stdout); err = getaddrinfo(hst, prt, &hints, &result); if (err) { fprintf(stderr, "failed: %s\n", gai_strerror(err)); sock = -1; goto __exit; } printf("Ok\n"); for (rp = result; rp; rp = rp->ai_next) { void *ap; int port; switch (rp->ai_family) { case AF_INET: { struct sockaddr_in *sin = (struct sockaddr_in*)rp->ai_addr; ap = (void*)&sin->sin_addr; port = sin->sin_port; } break; case AF_INET6: { struct sockaddr_in6 *sin = (struct sockaddr_in6*)rp->ai_addr; ap = (void*)&sin->sin6_addr; port = sin->sin6_port; } break; default: continue; } memset(abuf, 0, INET6_ADDRSTRLEN); printf("Trying [%s]:%d... ", inet_ntop(rp->ai_family, ap, abuf, INET6_ADDRSTRLEN), ntohs(port) ); fflush(stdout); sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (-1 == sock) { fprintf(stderr, "failed: %s\n", strerror(errno)); continue; }; err = connect(sock, rp->ai_addr, rp->ai_addrlen); if (-1 == err) { fprintf(stderr, "failed: %s\n", strerror(errno)); close(sock); continue; } printf("Ok, connected.\n"); break; } if (!rp) sock = -1; freeaddrinfo(result); __exit: return sock; } char buf[2048]; void gds_ask(int fd, char *cmd) { int r; char c; int k; printf("TX: %s", cmd); r = write(fd, cmd, strlen(cmd)); if (-1 == r) { perror("write()"); exit(1); }; memset(buf, 0, sizeof(buf)); k = 0; do { r = read(fd, &c, 1); if (-1 == r) { perror("read()"); break; }; buf[k++] = c; if (k == sizeof(buf)) break; } while (c != '\n'); printf("RX: %s", buf); } int main(int argc, char *argv[]) { int fd; if (1 == argc) { printf("Usage: %s host [service]\n", argv[0]); exit(0); }; /* argv[1] - host, argv[2] - service */ fd = get_sock_fd(argv[1], argv[2]); if (-1 == fd) exit(1); gds_ask(fd, "*idn?\n"); close(fd); exit(0); }