/* Reader/writer to TCP/IP socket */ #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, int p) { struct hostent *remote; struct sockaddr_in addr; int sock; if (!(remote=gethostbyname(n))) { fprintf(stderr,"%s: unknown host %s\n",name,n); exit(EXIT_FAILURE); } memcpy(&addr.sin_addr, remote->h_addr, remote->h_length); if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1) { perror(name); exit(EXIT_FAILURE); } addr.sin_family=AF_INET; addr.sin_port=htons(p); if (connect(sock,(void*)&addr,sizeof(addr))==-1) { perror(name); exit(EXIT_FAILURE); } return sock; } int main(int argc, char *argv[]) { struct sockaddr_in addr; int 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],atoi(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; }