/* A simple server to attach to */ #include #include #include #include #include #include #include #include #include static const char *name; static int Socket(int p) { struct sockaddr_in addr; int sock_fd; if ((sock_fd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(EXIT_FAILURE); } /* 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,(void*)&addr,sizeof(addr))==-1) { perror("bind"); exit(EXIT_FAILURE); } if (listen(sock_fd,5)==-1) { perror("listen"); exit(EXIT_FAILURE); } return sock_fd; } int main(int argc, char *argv[]) { struct sockaddr_in addr; char buff[1024]; int len; int addrlen; int sock_fd; int connect_fd; name=argv[0]; if (argc!=2) { fprintf(stderr,"%s: usage %s port\n", name, name); exit(1); } sock_fd = 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("accept"); exit(1); } addrlen=sizeof(addr); if (getsockname(connect_fd,(void*)&addr,&addrlen)!=0) { perror("getsockname"); } printf("%s: connection ON port %d\n",name,ntohs(addr.sin_port)); addrlen=sizeof(addr); if (getpeername(connect_fd,(void*)&addr,&addrlen)!=0) { perror("getpeername"); } 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); } if (len == -1) { perror("read"); } close(connect_fd); } return EXIT_SUCCESS; }