/* Reader/writer to TCP/IP socket */ #include #include #include #include #include #include #include char *name; int sock; char *GetLine(); int Connect(); main(argc,argv) int argc; char *argv[]; { struct sockaddr_in addr; int addrlen; char *p; char buff[1024]; int len; name=argv[0]; if (argc<3) { fprintf(stderr,"%s: usage %s host port [nowrite]\n",name,name); exit(1); } Connect(argv[1],atoi(argv[2])); /* Test to see how to get the connected local port number */ addrlen=sizeof(addr); if (getsockname(sock,&addr,&addrlen)!=0) perror(name); printf("%s: bound through port %d\n",name,ntohs(addr.sin_port)); while((argc==4)||(p=GetLine())) { if ((argc!=4)&&(write(sock,p,strlen(p))==-1)) { perror(name); close(sock); exit(1); } if ((len=read(sock,buff,1024))<=0) { perror(name); close(sock); exit(1); } buff[len]=0; printf("%s\n",buff); } close(sock); printf("\n"); return(0); } char *GetLine() { static char buff[1024]; int l; if (feof(stdin)) return(NULL); printf("> "); if (!gets(buff)) return(NULL); l=strlen(buff); if (buff[l-1]=='\n') buff[l-1]=0; if (strlen(buff)) return(buff); else return(GetLine()); } int Connect(n,p) char *n; int p; { struct hostent *remote; struct sockaddr_in addr; if (!(remote=gethostbyname(n))) { fprintf(stderr,"%s: unknown host %s\n",name,n); exit(1); } bcopy(remote->h_addr,&addr.sin_addr,remote->h_length); if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1) { perror(name); exit(1); } addr.sin_family=AF_INET; addr.sin_port=htons(p); if (connect(sock,&addr,sizeof(addr))==-1) { perror(name); exit(1); } }