diff options
Diffstat (limited to 'sock.c')
-rw-r--r-- | sock.c | 130 |
1 files changed, 130 insertions, 0 deletions
@@ -0,0 +1,130 @@ +/* + Reader/writer to TCP/IP socket +*/ +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <netdb.h> + +#include <stdio.h> +#include <errno.h> + +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); + } +} |