diff options
author | Ian C <ianc@noddybox.co.uk> | 2010-11-08 15:54:24 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2010-11-08 15:54:24 +0000 |
commit | 85c492a2bd5bb1a2619ad709f038576d30262fb5 (patch) | |
tree | cadc2da89a5b5da562f98503903a34745edca604 | |
parent | e3c10bc9343baa5ea3dcc57063d28b3742479245 (diff) |
Tidied up sock.c
-rw-r--r-- | sock.c | 190 |
1 files changed, 107 insertions, 83 deletions
@@ -1,130 +1,154 @@ /* Reader/writer to TCP/IP socket */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> + #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 const char *name; +static const char *GetLine(void) { static char buff[1024]; int l; if (feof(stdin)) + { return(NULL); + } printf("> "); - if (!gets(buff)) + if (!fgets(buff, sizeof buff, stdin)) + { return(NULL); + } l=strlen(buff); - if (buff[l-1]=='\n') + if (l > 0 && buff[l-1]=='\n') + { buff[l-1]=0; + } if (strlen(buff)) - return(buff); + { + return buff; + } else - return(GetLine()); + { + return GetLine(); + } } -int Connect(n,p) -char *n; -int p; - +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(1); - } + exit(EXIT_FAILURE); + } - bcopy(remote->h_addr,&addr.sin_addr,remote->h_length); + memcpy(&addr.sin_addr, remote->h_addr, remote->h_length); if ((sock=socket(AF_INET,SOCK_STREAM,0))==-1) - { + { perror(name); - exit(1); - } + exit(EXIT_FAILURE); + } addr.sin_family=AF_INET; addr.sin_port=htons(p); - if (connect(sock,&addr,sizeof(addr))==-1) - { + 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); - exit(1); + } + + 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; } |