さっき Python で書いたやつ を、C で書きなおした。「さっき」といっても、この記事は1年近く下書きに眠っていた!!
#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> int main() { int sock, conn; int socket_yes = 1; struct sockaddr_in server_addr, client_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(12345); server_addr.sin_addr.s_addr = INADDR_ANY; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { printf("couldn't open socket"); return 1; } setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &socket_yes, sizeof(socket_yes)); bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); listen(sock, 1); while (1) { printf("Waiting ...\n"); int len = sizeof(client_addr); conn = accept(sock, (struct sockaddr *)&client_addr, &len); printf("Connected.\n"); char in_buf[512]; while (1) { int read_len = read(conn, in_buf, 510); if (read_len == 0) { break; } buf[read_len] = NULL; printf("Received: %s", in_buf); write(conn, "OK", 3); } close(conn); printf("Connection closed from client.\n"); } close(sock); return 0; }
read のあと、NULL終末は自動で付かないので注意が必要。大抵のセキュリティ・ホールはここから始まるのである。上のコードが絶対に正しいと思わないこと!