summaryrefslogtreecommitdiff
path: root/sock.c
diff options
context:
space:
mode:
Diffstat (limited to 'sock.c')
-rw-r--r--sock.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/sock.c b/sock.c
new file mode 100644
index 0000000..03a7c39
--- /dev/null
+++ b/sock.c
@@ -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);
+ }
+}