diff --git a/server.c b/server.c
new file mode 100644
index 0000000000000000000000000000000000000000..06af57106d40c4ff6112d651357024e20b48771f
--- /dev/null
+++ b/server.c
@@ -0,0 +1,448 @@
+#include <arpa/inet.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <dirent.h>
+#include <wiringPiI2C.h>
+#include <wiringPi.h>
+#include <sys/wait.h>
+
+#define BUFFER_MAX 3
+#define DIRECTION_MAX 56
+#define VALUE_MAX 256
+
+#define IN 0
+#define OUT 1
+#define PWM 0
+
+#define LOW 0
+#define HIGH 1
+
+#define DISTANCE 5
+
+#define POUT_UL 23
+#define PIN_UL 24
+#define POUT_LED 17
+
+// Define some device parameters
+#define I2C_ADDR   0x27 // I2C device address
+
+// Define some device constants
+#define LCD_CHR  1 // Mode - Sending data
+#define LCD_CMD  0 // Mode - Sending command
+
+#define LINE1  0x80 // 1st line
+#define LINE2  0xC0 // 2nd line
+
+#define LCD_BACKLIGHT   0x08  // On
+// LCD_BACKLIGHT = 0x00  # Off
+
+#define ENABLE  0b00000100 // Enable bit
+
+char msg[3];
+int led = 0;
+int fd;
+
+void typeFloat(float myFloat);
+void typeInt(int i);
+void ClrLcd(void);
+void lcdLoc(int line);
+void typeChar(char val);
+void typeln(const char *s);
+void lcd_byte(int bits, int mode);
+void lcd_toggle_enable(int bits);
+void lcd_init();
+
+void error_handling(char *message) {
+  fputs(message, stderr);
+  fputc('\n', stderr);
+  exit(1);
+}
+
+int flag = 0;
+
+// float to string
+void typeFloat(float myFloat)   {
+  char buffer[20];
+  sprintf(buffer, "%4.2f",  myFloat);
+  typeln(buffer);
+}
+
+// int to string
+void typeInt(int i)   {
+  char array1[20];
+  sprintf(array1, "%d",  i);
+  typeln(array1);
+}
+
+// clr lcd go home loc 0x80
+void ClrLcd(void)   {
+  lcd_byte(0x01, LCD_CMD);
+  lcd_byte(0x02, LCD_CMD);
+}
+
+// go to location on LCD
+void lcdLoc(int line)   {
+  lcd_byte(line, LCD_CMD);
+}
+
+// out char to LCD at current position
+void typeChar(char val)   {
+
+  lcd_byte(val, LCD_CHR);
+}
+
+// this allows use of any size string
+void typeln(const char *s)   {
+
+  while ( *s ) lcd_byte(*(s++), LCD_CHR);
+
+}
+
+void lcd_byte(int bits, int mode)   {
+
+  //Send byte to data pins
+  // bits = the data
+  // mode = 1 for data, 0 for command
+  int bits_high;
+  int bits_low;
+  // uses the two half byte writes to LCD
+  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT ;
+  bits_low = mode | ((bits << 4) & 0xF0) | LCD_BACKLIGHT ;
+
+  // High bits
+  wiringPiI2CReadReg8(fd, bits_high);
+  lcd_toggle_enable(bits_high);
+
+  // Low bits
+  wiringPiI2CReadReg8(fd, bits_low);
+  lcd_toggle_enable(bits_low);
+}
+
+void lcd_toggle_enable(int bits)   {
+  // Toggle enable pin on LCD display
+  delayMicroseconds(500);
+  wiringPiI2CReadReg8(fd, (bits | ENABLE));
+  delayMicroseconds(500);
+  wiringPiI2CReadReg8(fd, (bits & ~ENABLE));
+  delayMicroseconds(500);
+}
+
+void lcd_init()   {
+  // Initialise display
+  lcd_byte(0x33, LCD_CMD); // Initialise
+  lcd_byte(0x32, LCD_CMD); // Initialise
+  lcd_byte(0x06, LCD_CMD); // Cursor move direction
+  lcd_byte(0x0C, LCD_CMD); // 0x0F On, Blink Off
+  lcd_byte(0x28, LCD_CMD); // Data length, number of lines, font size
+  lcd_byte(0x01, LCD_CMD); // Clear display
+  delayMicroseconds(500);
+}
+
+static int GPIOExport(int pin) {
+  char buffer[BUFFER_MAX];
+  ssize_t bytes_written;
+  int fd;
+
+  fd = open("/sys/class/gpio/export", O_WRONLY);
+  if (-1 == fd) {
+    fprintf(stderr, "Failed to open export for writing!\n");
+    return (-1);
+  }
+
+  bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin);
+  write(fd, buffer, bytes_written);
+  close(fd);
+  return (0);
+}
+
+static int GPIOUnexport(int pin) {
+  char buffer[BUFFER_MAX];
+  ssize_t bytes_written;
+  int fd;
+
+  fd = open("/sys/class/gpio/unexport", O_WRONLY);
+  if (-1 == fd) {
+    fprintf(stderr, "Failed to open unexport for writing!\n");
+    return (-1);
+  }
+  bytes_written = snprintf(buffer, BUFFER_MAX, "%d", pin);
+  write(fd, buffer, bytes_written);
+  close(fd);
+  return (0);
+}
+
+static int GPIODirection(int pin, int dir) {
+  static const char s_directions_str[] = "in\0out";
+  char path[DIRECTION_MAX] = "/sys/class/gpio/gpio%d/direction";
+  int fd;
+
+  snprintf(path, DIRECTION_MAX, "/sys/class/gpio/gpio%d/direction", pin);
+
+  fd = open(path, O_WRONLY);
+  if (-1 == fd) {
+    fprintf(stderr, "Failed to open gpio direction for writing!\n");
+    return (-1);
+  }
+
+  if (-1 ==
+      write(fd, &s_directions_str[IN == dir ? 0 : 3], IN == dir ? 2 : 3)) {
+    fprintf(stderr, "Failed to set direction!\n");
+    return (-1);
+  }
+
+  close(fd);
+  return (0);
+}
+
+static int GPIORead(int pin) {
+  char path[VALUE_MAX];
+  char value_str[3];
+  int fd;
+
+  snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin);
+  fd = open(path, O_RDONLY);
+  if (-1 == fd) {
+    fprintf(stderr, "Failed to open gpio value for reading!\n");
+    return (-1);
+  }
+
+  if (-1 == read(fd, value_str, 3)) {
+    fprintf(stderr, "Failed to read value!\n");
+    return (-1);
+  }
+
+  close(fd);
+
+  return (atoi(value_str));
+}
+
+static int GPIOWrite(int pin, int value) {
+  static const char s_values_str[] = "01";
+  char path[VALUE_MAX];
+  int fd;
+
+  snprintf(path, VALUE_MAX, "/sys/class/gpio/gpio%d/value", pin);
+  fd = open(path, O_WRONLY);
+  if (-1 == fd) {
+    fprintf(stderr, "Failed to open gpio value for writing!\n");
+    return (-1);
+  }
+
+  if (1 != write(fd, &s_values_str[LOW == value ? 0 : 1], 1)) {
+    fprintf(stderr, "Failed to write value!\n");
+    return (-1);
+
+    close(fd);
+    return (0);
+  }
+}
+
+void* thread_situation(){//��Ȳ��
+  char msg[200] = {0};
+
+  if (GPIOExport(POUT_LED) == -1) {
+    exit(1);
+  }
+
+  if (GPIODirection(POUT_LED, OUT) == -1) {
+    exit(1);
+  }
+
+  while(1){
+    if(led == 1){
+      if (GPIOWrite(POUT_LED, 1) == -1) {
+      exit(1);
+      }
+    }else{
+      if (GPIOWrite(POUT_LED, 0) == -1) {
+      exit(1);
+      }
+    }
+    usleep(500 * 1000);
+  }
+
+  if (GPIOUnexport(POUT_LED) == -1) {
+    exit(1);
+  }
+}
+
+void* thread_ultrasonic(){//������ ����
+  char msg[200] = {0};
+  clock_t start_t, end_t;
+  double time;
+  if (-1 == GPIOExport(POUT_UL) || -1 == GPIOExport(PIN_UL)) {
+    printf("gpio export err\n");
+    exit(1);
+  }2
+  usleep(100000);
+  if (-1 == GPIODirection(POUT_UL, OUT) || -1 == GPIODirection(PIN_UL, IN)) {
+    printf("gpio direction err\n");
+    exit(1);
+  }
+  GPIOWrite(POUT_UL, 0);
+  usleep(10000);
+  // start
+  while (1){
+    if (-1 == GPIOWrite(POUT_UL, 1)) {
+      printf("gpio write/trigger err\n");
+      exit(1);
+    }
+    // 1sec == 1000000ultra_sec, 1ms = 1000ultra_sec
+    usleep(10);
+    GPIOWrite(POUT_UL, 0);
+
+    while (GPIORead(PIN_UL) == 0) {
+      start_t = clock();
+    }
+    while (GPIORead(PIN_UL) == 1) {
+      end_t = clock();
+    }
+
+    time = (double)(end_t - start_t) / CLOCKS_PER_SEC;  // ms
+    if(time/2*34000<DISTANCE){
+      ClrLcd();
+      lcdLoc(LINE1);
+      typeln("Process Start");
+      led = 1;
+      flag = 1;
+    }else if(flag == 1){
+      ClrLcd();
+      lcdLoc(LINE1);
+      typeln("Processing...");
+    }else{
+      ClrLcd();
+      lcdLoc(LINE1);
+      typeln("waiting");
+      led = 0;
+    }
+
+    usleep(1000000);
+  }
+    if (-1 == GPIOUnexport(POUT_UL) || -1 == GPIOUnexport(PIN_UL)) exit(1);
+}
+
+void* thread_LCD(){
+  if (wiringPiSetup () == -1) exit (1);
+  fd = wiringPiI2CSetup(I2C_ADDR);
+  printf("fd = %d ", fd);
+  lcd_init(); // setup LCD
+}
+
+void* action(void* arg){
+    int clnt_sock = *((int*)arg);
+    char msg[100] = {0};
+    pid_t var;
+    int state;
+    int count = 0;
+    var = fork(); //�ڽ����μ��� ����
+    if(var==0){
+        printf("[pid:%d] redirect client fd\n",getpid(),clnt_sock);//Ŭ���̾�Ʈ�� ���� ���� ȣ��
+        while(1){
+            read(clnt_sock,msg,sizeof(msg)); //Ŭ���̾�Ʈ�� ���� ������ �޾ƿ�
+            if(!strcmp(msg,"END")){
+              ClrLcd();
+              lcdLoc(LINE1);
+              typeln("drone check");
+              lcdLoc(LINE2);
+              typeln("complete");
+              flag = 0;
+            }else if(!strcmp(msg,"NO")){
+              count++;
+              if(count >= 5){
+                ClrLcd();
+                lcdLoc(LINE1);
+                typeln("Belt Maifunction");
+                count = 0;
+                flag = 0;
+              }
+            }
+        }
+    }else{
+        printf("[pid:%d] process forekd\n",getpid());
+        wait(&state);//�ڽ����μ����� ���� �� �� ���� ���
+    }
+    close(clnt_sock);
+}
+
+void* do_clnt(void* arg){
+  int thr_id;
+  struct sockaddr_in clnt_addr;
+  socklen_t clnt_addr_size;
+  int serv_sock = *((int*)arg);
+  int clnt_sock[55]; //Ŭ���̾�Ʈ ������ ���� ����
+  int i = 0;
+  pthread_t tid[2];
+  while (1) {
+    clnt_sock[i] = -1;
+    clnt_addr_size = sizeof(clnt_addr);
+    clnt_sock[i] =
+    accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
+    if (clnt_sock[i] == -1) error_handling("accept() error");
+    printf("[*] client join\n");
+    printf("[*] wait for client\n");
+    pthread_create(&tid[i],NULL,action,(void*)&clnt_sock[i]); //��Ƽ�����带 ����Ͽ� shell�Լ� ȣ��
+    pthread_detach(tid[i]);//������ ����
+    i++;
+  }
+  close(serv_sock);//���� ����
+}
+
+int main(int argc, char *argv[]) {
+    int serv_sock;
+    struct sockaddr_in serv_addr;
+    int status;
+    int thr_id;
+
+    if (argc != 2) {
+        printf("Usage : %s <port>\n", argv[0]);
+    }
+
+    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
+    if (serv_sock == -1) error_handling("socket() error");
+
+    memset(&serv_addr, 0, sizeof(serv_addr));
+    serv_addr.sin_family = AF_INET;
+    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    serv_addr.sin_port = htons(atoi(argv[1]));
+    if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
+        error_handling("bind() error");
+
+    if (listen(serv_sock, 5) == -1) error_handling("listen() error");
+    printf("[*] socket initialized\n");
+    printf("[*] wait for client\n");
+    pthread_t tid[4];
+    thr_id = pthread_create(&tid[0], NULL, thread_LCD, NULL);//��Ƽ������� LCD �۵�
+    if (thr_id < 0) {
+      perror("thread create error : ");
+      exit(0);
+    }
+    thr_id = pthread_create(&tid[1], NULL, thread_situation, NULL);//��Ƽ������� ��Ȳ�� ����
+    if (thr_id < 0) {
+      perror("thread create error : ");
+      exit(0);
+    }
+    thr_id = pthread_create(&tid[2], NULL, thread_ultrasonic, NULL);//��Ƽ������� ������ ����
+    if (thr_id < 0) {
+      perror("thread create error : ");
+      exit(0);
+    }
+    thr_id = pthread_create(&tid[3], NULL, do_clnt, (void *)&serv_sock);//Ŭ���̾�Ʈ�� ���
+    if (thr_id < 0) {
+      perror("thread create error : ");
+      exit(0);
+    }
+    pthread_join(tid[0], (void **)&status);
+    pthread_join(tid[1], (void **)&status);
+    pthread_join(tid[2], (void **)&status);
+    pthread_join(tid[3], (void **)&status);//�����尡 �����Ͽ� ������ ������ ���
+    printf("[*] session closed\n");
+    close(serv_sock);//��������
+    return (0);
+}
\ No newline at end of file