C で socket

さっき 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終末は自動で付かないので注意が必要。大抵のセキュリティ・ホールはここから始まるのである。上のコードが絶対に正しいと思わないこと!