#include #include #include #include #include #include #include #define PORT 9000 static inline void die(const char *msg) { perror(msg); exit(-1); } int main() { struct sockaddr_in srv_addr, cli_addr; int sockopt = 1; socklen_t sad_sz = sizeof(struct sockaddr_in); int sfd, cfd; ssize_t bytes; char in_buf[256]; char out_buf[256]; srv_addr.sin_family = AF_INET; srv_addr.sin_port = htons(PORT); srv_addr.sin_addr.s_addr = INADDR_ANY; if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) die("Could not open socket"); setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *) &sockopt, sizeof(sockopt)); if (bind(sfd, (struct sockaddr *) &srv_addr, sad_sz) < 0) die("Could not bind socket"); if (listen(sfd, 1) < 0) die("Could not listen on socket"); cfd = accept(sfd, (struct sockaddr *) &cli_addr, &sad_sz); if (cfd < 0) die("Could not accept incoming connection"); printf("srv: connected: %s\n", inet_ntoa(cli_addr.sin_addr)); while ((bytes = read(cfd, in_buf, sizeof(in_buf))) != 0) { if (bytes < 0) die("Couldn't receive message"); printf("srv: %s\n", in_buf); if (strcmp(in_buf, "get") == 0) { // TODO: implement get } else if (strcmp(in_buf, "put") == 0) { // TODO: implement put } else if (strcmp(in_buf, "ping") == 0) { strncpy(out_buf, "pong!", sizeof(out_buf)); } else { // TODO: connect our shell implementation strncpy(out_buf, "got: ", sizeof(out_buf)); strncpy(out_buf + sizeof("got: "), in_buf, sizeof(out_buf) - sizeof("got: ")); } if (write(cfd, out_buf, sizeof(out_buf)) < 0) die("Couldn't send message"); } printf("srv: closing down\n"); close(cfd); close(sfd); }