/* A simple server to attach to */ #include #include #include #include #include #include #include #include #include #include #include #define DUMP_WIDTH 16 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; } static void Dump(const char *p, int len) { char asc[DUMP_WIDTH + 1] = {0}; unsigned int off = 0; int col = 0; while (len > 0) { unsigned char c = *p; if (col == 0) { printf("%4.4x:", off); } printf(" %2.2x", (unsigned int)c); asc[col++] = isprint(c) ? c : '.'; if (col == DUMP_WIDTH) { printf(" %s\n", asc); memset(asc, 0, sizeof asc); col = 0; } off++; p++; len--; } if (col > 0) { while (col++ < DUMP_WIDTH) { printf(" **"); } printf(" %s\n", asc); } } int main(int argc, char *argv[]) { struct sockaddr_in addr; char buff[1025]; int len; socklen_t addrlen; int sock_fd; int connect_fd; int ascii = 0; name=argv[0]; if (argc<2) { fprintf(stderr,"%s: usage %s port [-a]\n", name, name); exit(1); } ascii = (argc == 3 && strcmp(argv[2], "-a") == 0); 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; if (ascii) { printf("%s", buff); } else { printf("%s: recieved\n",name); Dump(buff, len); } } if (len == -1) { perror("read"); } close(connect_fd); } return EXIT_SUCCESS; }