#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h> //AF_INET 외부 내트워크 도메인
#include<sys/types.h>
#include<sys/socket.h>
#define MAXLINE 511
int main(int argc, char* argv[]) {
       int serv_sock;
       int conn_sock;
       struct sockaddr_in serv_addr;
       struct sockaddr_in conn_addr;
       int addrlen, datalen;
       char buf[MAXLINE + 1];
       int nbytes;
       pid_t pid;
       if (argc != 2) { //사용법 숙지
              printf("Usage : %s <port>\n", argv[0]);
              exit(0);
       }
       serv_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // serv_sock를 소켓 파일 서술자로 만든다.
       if (serv_sock == -1) {
              perror("socket() error\n");
              exit(0);
       }
       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) {
              perror("bind() error\n"); //bind(). 소켓 파일 서술자에게 ip, port 주소를 가진 구조체를 넣어준다.
              exit(0);
       }
       if (listen(serv_sock, 1) == -1) { // 소켓 대기열 생성
              perror("listen() error\n");
              exit(0);
       }
       addrlen = sizeof(conn_sock);
       conn_sock = accept(serv_sock, (struct sockaddr*)&conn_addr, &addrlen); //전화오기를 기다림.
       if (conn_sock == -1) {
              perror("accept() error\n");
              exit(0);
       }
       if ((pid = fork()) == -1) { close(conn_sock); perror("fork() error"); exit(0); }
       else if (pid == 0) { //자식프로세스이다.
              while (1) {
                     fgets(buf, sizeof(buf), stdin);
                     nbytes = strlen(buf);
                     write(conn_sock, buf, MAXLINE);
                     if ((strncmp, "exit", 4) == 0) {
                           puts("Good Bye.");
                           exit(0);
                     } //자식프로세스는 stdin으로 사용자가 입력한 문자를 buf에 저장하여 소켓에다 write 시스템콜을 이용해
              }     //client에게 문자열을 보내고, exit를 입력시 종료하게 한다.
              exit(0);
       }
       else if (pid>0) { //부모프로세스이다.
              while (1) {
                     if ((nbytes = read(conn_sock, buf, MAXLINE)) <0) {
                           perror("read() error\n");
                           exit(0);
                     }
                     printf("%s", buf);
                     if (strncmp(buf, "exit", 4) == 0)
                           exit(0);
              } //부모프로세스는 client가 소켓에 보낸 문자열을 read로 읽어 저장한다.
       }     //역시 exit 가 날라왔을시에는 종료.
       return 0;

}


Visual Stdio로 코딩을 할때


프로젝트 -> (프로젝트) 속성을 보면


문자 집합으로 2가지가 있을거다



1 멀티바이트 문자 집합

2. 유니코드 문자 집합


그 전에 아스키코드에 대해 알아야 이해하기 쉬울것이다.

아스키코드는 문자를 모르는 컴퓨터를 위해 1Byte단위(8bit)로 128개의 글자와 일부 특수문자들을 매칭시켜놓은 것이라 보면된다.


멀티바이트에 대해서 알아보면

멀티바이트는 1Byte로는 다른 언어를 표시할수가 없었고, 한국어나 일본어 등

영어를 제외한 언어마다 크기를 다르게 할당을 해주는 방식이 만들어야 했고, 이렇게 만들어진 것이 멀티바이트 방식이다.

"hello헬로"라는 문자열 배열은 총 5+4+1(Null)=10Byte가 된다.


근데 멀티바이트에는 문제가 있는게

"A"가 들어가거나 "가"가 들어간 것의 배열의 크기를 다르게 인식하다보니

프로그래밍을 어렵게 만들게 했다. 이 문제를 해결하기 위해 유니코드 방식이 만들어졌고

처음부터 칸을 2Byte로 만들어 이 안에 세상의 모든 글자들을 담을 수 있게 했다.

영어든 타 언어든 무조건 2Byte

+ Recent posts