리눅스 기반의 초간단 에코서버
gcc 로 대충 어울렁더울렁 컴파일해서 ./a.out 으로 열심히 하면 됨.
 
 
file: main.c
 
 
 
 
 
 
 
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define PORT 5471
#define MAX_BUF 1024
 
 

int main()
{
  int ssock, csock;
  int clen;
 
  struct sockaddr_in server_addr, client_addr;
  char szSendBuff[MAX_BUF];
  char szRecvBuff[MAX_BUF];

  // 서버 소켓 생성
  if ((ssock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
  {
    perror("socket error: ");
    exit(1);
  }
  clen=sizeof(client_addr);
 
 
  // 서버 구조체 초기화
  memset(&server_addr, 0x00, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  server_addr.sin_port = htons(PORT);
 
 
  // bind
  if (bind(ssock, (struct sockaddr *)&server_addr, sizeof(server_addr))<0)
  {
    perror("bind error : ");
    exit(1);
  }
 

  // listen
  if (listen(ssock, 8) < 0)
  {
    perror("listen error : ");
    exit(1);
  }
 
 
 
 
  // Accept 루프
  while (1)
  {
    // Send, Recv 버퍼 초기화
    memset(szSendBuff, 0x00, sizeof(szSendBuff));
    memset(szRecvBuff, 0x00, sizeof(szRecvBuff));
 
    // accept 
    csock = accept(ssock, (struct sockaddr *)&client_addr, &clen);
 
    // Recv
    if (recv(csock, szRecvBuff, MAX_BUF, 0) <= 0)
    {
       perror("read error : ");
       exit(1);
    }
 
    // Recv 된 버퍼가 1 이면 1 을 보내고 아니라면 2를 보냄
    // 보내기 버퍼 세팅
    if (strcmp(szRecvBuff, "1")==0)
    {
       strcpy(szSendBuff, "1");
    }
    else
    {
       strcpy(szSendBuff, "2");
    }
 
    // Send
    if (send(csock, szSendBuff, MAX_BUF, 0) <= 0)
    {
       perror("write error : ");
       exit(1);
    }
 
    close(csock);
  } // while (1)
 
  close(ssock);
  return 0;
}










Posted by bloodguy
,