#include #include #include #include #include #include #include void *client_thread(void *vptr) { int fd = *((int *)vptr); while(1) { // accept any message unsigned char buffer[4097]; ssize_t len = recv(fd, buffer, sizeof(buffer)-1, 0); if (len <= 0) { printf("client %d disconnected\n", fd); break; } // print it out buffer[len] = '\0'; printf("[%d] recv() binary:", fd); for(ssize_t i = 0; i < len; i+=1) printf(" %02x", buffer[i]); printf("\n"); printf("[%d] recv(): %s\n", fd, buffer); // send "I got it" back sprintf(buffer, "recv()ed %ld bytes\n", len); send(fd, buffer, strlen(buffer), 0); // to do: check return value } return NULL; } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s \n", argv[0]); return 1; } int port = atoi(argv[1]); printf("Binding to port %d. Visit http://localhost:%d/ to interact with your server!\n", port, port); // socket: int sockfd = socket(AF_INET, SOCK_STREAM, 0); // bind: struct sockaddr_in server_addr, client_address; memset(&server_addr, 0x00, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(port); bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)); // listen: listen(sockfd, 10); // accept: socklen_t client_addr_len; while (1) { int *fd = malloc(sizeof(int)); client_addr_len = sizeof(struct sockaddr_in); *fd = accept(sockfd, (struct sockaddr *)&client_address, &client_addr_len); printf("Client connected from %s (fd=%d)\n", inet_ntoa(client_address.sin_addr), *fd); pthread_t tid; pthread_create(&tid, NULL, client_thread, fd); pthread_detach(tid); } return 0; }