/* Simple echo server * Jeff Turkstra, 2010 */ #include #include #include #include int main(int argc, char *argv[]) { int me; int client; struct sockaddr_in my_addr; struct sockaddr_in client_addr; int client_size; char buf[512]; if (argc != 2) { printf("Usage: %s [port]\n", argv[0]); return -1; } me = socket(PF_INET, SOCK_STREAM, 0); if (me <= 0) { perror("socket"); return -1; } memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_addr.s_addr = htonl(INADDR_ANY); my_addr.sin_port = htons(atoi(argv[1])); if (bind(me, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0) { perror("bind"); return -1; } if (listen(me, 1) < 0) { perror("listen"); return -1; } client = 0; while (1) { client_size = sizeof(client_addr); if (!client) { client = accept(me, (struct sockaddr *) &client_addr, &client_size); if (client < 0) { perror("client"); return -1; } else { printf("Connected to %s\n", inet_ntoa(client_addr.sin_addr)); } } client_size = recv(client, buf, 1024, 0); if (client_size < 0) { perror("recv"); return -1; } if (client_size == 1) return 0; if (send(client, buf, client_size, 0) < 0) { perror("send"); return -1; } } return 0; }