간단한 소켓 프로그램

이동욱

2021/08/02

Categories: 네트워크

간단한 소켓 프로그램


#include <sys/types.h>
#include <sys/socket.h>

int listen(int sockfd, int backlog);
#include <sys/types.h>
#include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, socket_t addrlen);
#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

7099 epsi

서버 프로그램


클라이언트쪽으로부터 “How old are you?” 라는 문자열을 전송받은 후에 이것을 전송한다. 클라이언트쪽으로 “I am 20 years old” 라는 문자열을 전송한 후에 화면에 출력한다.

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/socket.h>

#define PORT 9001

int main() {
  int srv_sd, client_sd;
  struct sockaddr_in srv_addr, client_addr;
  int client_addr_len, read_len;
  char read_buff[BUFSIZ];
  char write_buff[BUFSIZ] = "I am 20 years old.";

  srv_sd = socket(PF_INET, SOCK_STREAM, 0);

  if (srv_sd == -1) {
    printf("socket creation error");
    return -1;
  }
  printf("==== server program ====\n");

  memset(&srv_addr, 0, sizeof(srv_addr));
  srv_addr.sin_family = AF_INET;
  srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  srv_addr.sin_port = htons(PORT);

  if (bind(srv_sd, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -1) {
    printf("bind error");
    return -1;
  }

  if (listen(srv_sd, 5) == -1) {
    printf("listen error");
    return -1;
  }

  client_addr_len = sizeof(client_addr);
  client_sd = accept(srv_sd, (struct sockaddr*)&client_addr, &client_addr_len);

  if (client_sd == -1) {
    printf("accept error");
    return -1;
  }
  write(client_sd, write_buff, sizeof(write_buff));
  printf("server: %s\n", write_buff);

  read_len = read(client_sd, read_buff, sizeof(read_buff));
  if (read_len == -1) {
    printf("read error");
    return -1;
  }

  read_buff[read_len] = '\0';
  printf("client: %s\n", read_buff);

  close(client_sd);
  close(srv_sd);

  return 0;
}

클라이언트 프로그램


같은 호스트 안에 위치한 서버 프로그램에 TCP 9001번 포트로 연결을 시도한다. 연결 후 서버 프로그램으로 ‘How old are you?’ 라는 문자열을 전송한 후에 화면에 출력한다. 서버로부터 ‘I am 20 years old.’ 라는 문자열을 전송 받은 후에 화면에 출력한다.

#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

#define PORT 9001

int main() {
  int client_sd;
  struct sockaddr_in client_addr;

  int client_addr_len, read_len;
  char write_buff[BUFSIZ] = "How old are you?";
  char read_buff[BUFSIZ];

  client_sd = socket(PF_INET, SOCK_STREAM, 0);
  if (client_sd == -1) {
    printf("socket creation error");
    return -1;
  }
  printf("==== client program ====\n");

  memset(&client_addr, 0, sizeof(client_addr));
  client_addr.sin_family = AF_INET;
  client_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  client_addr.sin_port = htons(PORT);

  if (connect(client_sd, (struct sockaddr *) &client_addr, sizeof(client_addr)) == -1) {
    printf("connection error");
    close(client_sd);
    return -1;
  }

  write(client_sd, write_buff, sizeof(write_buff));
  printf("client: %s\n", write_buff);

  read_len = read(client_sd, read_buff, sizeof(read_buff));
  if (read_len == -1) {
    printf("read error");
    return -1;
  }
  read_buff[read_len] = '\0';
  printf("server: %s\n", read_buff);
  close(client_sd);
  return 0;
}

Screen Shot 2021-08-02 at 3 32 59 AM

에러 처리


client_sd = socket(PF_INET, SOCK_STREAM, 0);

if (client_sd == -1) {
  if (errno == EINVAL) {
    printf("protocol family error");
    return -1;
  }
  printf("socket creation error");
  return -1;
}
#include <stdio.h>

void perror(const char *msg);

int foo(int domain, int type, int protocol) {
  int res;
  res = socket(domain, type, protocol);
  if (res == -1) {
    perror("socket");
  }
  return res;
}

참고 문헌


>> Home