diff options
Diffstat (limited to 'serv.c')
-rw-r--r-- | serv.c | 105 |
1 files changed, 105 insertions, 0 deletions
@@ -0,0 +1,105 @@ +/* A simple server to attach to +*/ +#include <sys/types.h> + +#include <stdio.h> +#include <errno.h> + +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <netdb.h> + +char *name; +int sock_fd; +int connect_fd; + +void Socket(short); + +main(argc,argv) +int argc; +char *argv[]; + +{ + struct sockaddr_in addr; + char buff[1024]; + int len; + int addrlen; + + name=argv[0]; + + if (argc!=2) + { + fprintf(stderr,"%s: usage %s port\n",name,name); + exit(1); + } + + Socket((short)atoi(argv[1])); + + printf("%s: socket bound\n",name); + + while(1) + { + printf("%s: accepting\n",name); + if ((connect_fd=accept(sock_fd,NULL,0))==-1) + { + perror(name); + exit(1); + } + + addrlen=sizeof(addr); + if (getsockname(connect_fd,&addr,&addrlen)!=0) + perror(name); + + printf("%s: connection ON port %d\n",name,ntohs(addr.sin_port)); + + addrlen=sizeof(addr); + if (getpeername(connect_fd,&addr,&addrlen)!=0) + perror(name); + + printf("%s: connection FROM port %d\n",name,ntohs(addr.sin_port)); + + while((len=read(connect_fd,buff,1024))>0) + { + buff[len]=0; + printf("%s: recieved '%s'\n",name,buff); + write(connect_fd,buff,len); + } + + perror(name); + + close(connect_fd); + } + + return(0); +} + + +void Socket(short p) +{ + struct sockaddr_in addr; + + if ((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1) + { + perror(name); + exit(1); + } + + /* Bind port to address + */ + addr.sin_family=AF_INET; + addr.sin_addr.s_addr=INADDR_ANY; + addr.sin_port=htons(p); + + if (bind(sock_fd,&addr,sizeof(addr))==-1) + { + perror(name); + exit(1); + } + + if (listen(sock_fd,5)==-1) + { + perror(name); + exit(1); + } +} |