/* Reader/writer to TCP/IP socket */ #include #include #include #include #include #include #include #include #include #include static const char *name; static const char *GetLine(void) { static char buff[1024]; int l; if (feof(stdin)) { return(NULL); } printf("> "); if (!fgets(buff, sizeof buff, stdin)) { return(NULL); } l=strlen(buff); if (l > 0 && buff[l-1]=='\n') { buff[l-1]=0; } if (strlen(buff)) { return buff; } else { return GetLine(); } } static int Connect(const char *n, const char *p) { struct addrinfo *addr, *addr_p; struct addrinfo hints = {0}; int status; int sock = -1; hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; status = getaddrinfo(n, p, &hints, &addr); if (status) { fprintf(stderr, "%s: %s\n", name, gai_strerror(status)); exit(EXIT_FAILURE); } for(addr_p = addr; addr_p && sock == -1; addr_p = addr_p->ai_next) { sock = socket(addr_p->ai_family, addr_p->ai_socktype, addr_p->ai_protocol); if (sock != -1) { if (connect(sock, addr_p->ai_addr, addr_p->ai_addrlen) == -1) { close(sock); sock = -1; } } } if (sock == -1) { fprintf(stderr, "%s: Failed to connect to %s:%s\n", name, n, p); exit(EXIT_FAILURE); } return sock; } int main(int argc, char *argv[]) { struct sockaddr_in addr; socklen_t addrlen; const char *p; char buff[1024]; int len; int sock; int no_read; int no_write; name=argv[0]; if (argc<3) { fprintf(stderr,"%s: usage %s host port [nowrite|noread]\n",name,name); exit(EXIT_FAILURE); } if (argc > 3) { no_read = strcmp(argv[3], "noread") == 0; no_write = strcmp(argv[3], "nowrite") == 0; } else { no_read = 0; no_write = 0; } sock = Connect(argv[1],argv[2]); /* Test to see how to get the connected local port number */ addrlen=sizeof(addr); if (getsockname(sock,(void*)&addr,&addrlen)!=0) { perror(name); } printf("%s: bound through port %d\n",name,ntohs(addr.sin_port)); while(no_write || (p=GetLine())) { if (!no_write && (write(sock,p,strlen(p))==-1)) { perror(name); close(sock); exit(EXIT_FAILURE); } if (!no_read) { if ((len=read(sock,buff,1024))<=0) { perror(name); close(sock); exit(EXIT_FAILURE); } buff[len]=0; printf("%s\n",buff); } } close(sock); printf("\n"); return EXIT_SUCCESS; }