#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define DEF_TCP_PORT 2222 int get_sock_fd(char* host_name, char* port) { struct in_addr host_ip; struct hostent *hostent; int sock = -1; struct sockaddr_in serv_addr; short int prt = DEF_TCP_PORT; int r; r = inet_aton(host_name, &host_ip); if (r) goto __have_ip; /* 'host_name' is not dotted decimal IPv4 address */ printf("Resolving '%s' ... ", host_name); fflush(stdout); hostent = gethostbyname(host_name); if (!hostent) { fprintf(stderr, "Can't resolve %s: %s\n", host_name, hstrerror(h_errno)); goto __exit; } host_ip = *(struct in_addr *)hostent->h_addr; printf("Ok\n"); __have_ip: if (port) { r = sscanf(port, "%hd", &prt); if (r != 1) printf("Invalid port '%s', will use default %d\n", port, prt); } sock = socket(AF_INET, SOCK_STREAM, 0); if (-1 == sock) { perror("socket()"); goto __exit; }; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(prt); serv_addr.sin_addr = host_ip; printf("Connecting to %s:%d... ", host_name, prt); fflush(stdout); r = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); if (-1 == r) { perror("Failed: "); close(sock); sock = -1; goto __exit; } printf("Ok\n"); __exit: return sock; } char buf[256]; void gds_ask(int fd, char *cmd) { int r; char c; int k; printf("SENT: %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("RECEIVED: %s", buf); } int main(int argc, char *argv[]) { int fd; if (1 == argc) { printf("Usage: %s host [port]\n", argv[0]); exit(0); }; /* argv[1] - host, argv[2] - port */ fd = get_sock_fd(argv[1], argv[2]); if (-1 == fd) exit(1); gds_ask(fd, "*idn?\n"); close(fd); exit(0); }