목록네트워크 (44)
K 개발자
tcp_chatserv_nonb.c 폴링형으로 구현한 채팅 서버 프로그램이다. 폴링 동작이 이루어지고 있는 것을 확인하기 위하여 100000번 폴링할 때마다 점(.)을 출력하도록 하였다. 한편 서버를 폴링형으로 구현하면 도착한 데이터가 없어도 계속 데이터 도착을 폴링하고 있으므로 CPU의 낭비가 발생한다는 것을 주의하기 바란다. #include #include #include #include #include #include #include #include #include #include #include #include #define MAXLINE 511 #define MAX_SOCK 1024 // 솔라리스는 64 char *EXIT_STRING = "exit"; char *START_STRING = "C..
채팅 클라이언트 프로그램은 키보드 입력 메시지를 서버로 전송하고, 서버가 보내온 메시지를 화면에 출력한다. 즉, 앞에서 소개한 토크 클라이언트 프로그램과 유사한 동작을 한다. 그러나 토크 클라이언트 프로그램에서는 사용자의 키보드 입력 처리와 수신 메시지 출력 두 가지 일을 동시에 수행하기 위해서 fork()를 이용하여 두 개의 프로세스를 만들고 각 프로세스가 이 두 가지 일을 담당하였으나, 채팅 클라이언트 프로그램에서는 select()를 이용하여 두 가지 입출력을 하나의 프로세스에서 처리하는 다중화 방법을 사용하였다. tcp_chatcli.c #include #include #include #include #include #include #include #include #include #include #..
TCP 서버 프로그램에서 소켓 개설, 서버주소 바인딩, listen() 함수의 호출은 자주 등장하므로 이들을 묶어 tcp_listen(AF_INET, servport, backlog)라는 함수를 정의하였다. tcp_listen()은 소켓을 개설하고 listen()을 호출한 후 listen 상태에 있는 소켓을 리턴한다. TCP 채팅 서버 프로그램에서는 무한 루프를 돌면서 채팅 가입자 처리와 채팅 메시지 방송을 수행하여야 하는데 이러한 작업을 하나의 프로세스가 다중처리하기 위해 select()를 사용하여 소켓을 비동기 모드로 바꾸었다. select()에서는 읽기 변화만 감지하면 되므로 select()의 두 번째 fd_set 타입의 인자 read_fds만 지정하고 세 번째와 네 번째 인자 즉, 쓰기 및 예외발..
이전 글 참고 토크 클라이언트 프로그램에서도 부모 프로세스는 키보드 메시지를 읽어 서버로 전송하며, 자식 프로세스는 상대방이 전송한 메시지를 화면에 출력하는 작업을 각각 수행한다. tcp_talkcli.c 토크 클라이언트 프로그램이다. tcp_talkserv.c에서 정의한 input_and_send()와 recv_and_print() 함수를 사용하였다. #include #include #include #include #include #include #include #include #include #define MAXLINE 511 char *EXIT_STRING = "exit"; // 종료문자 정의 int recv_and_print(int sd); // 상대로부터 메시지 수신후 화면 출력 int inpu..
토크 서버에서는 먼저 listen()을 호출하여 소켓을 수동 대기 모드로 바꾸고 accept()를 호출하여 클라이언트로부터의 연결을 기다리다 연결이 이루어지면 fork()를 호출한다. 부모 프로세스는 사용자의 키보드 입력을 받아 클라이언트에게 전송하며, 자식 프로세스는 클라이언트가 보내온 메시지를 화면에 출력한다. 서버가 사용할 포트번호는 명령문 인자로 입력한 값(argv[1])을 사용한다. 사용자가 종료문자(예 "exit")를 입력하면 부모 프로세스가 자식 프로세스를 종료시키고 프로그램을 종료시키도록 하였다. 입력된 문자열 내에 종료문자가 포함되어 있는지를 확인하기 위해서 strstr() 함수를 사용하였다. 또한 상대방이 "exit" 문자열이 포함된 메시지를 전송해 오면 토크 서비스를 중단하고 연결을 ..
udp_echoserv.c UDP 소켓으로 에코 서비스를 하는 프로그램이다. UDP 에코 서버 프로그램은 클라이언트 프로그램과 거의 같은데 왜냐하면, UDP 통신 프로그램에서는 서버와 클라이언트의 구분이 없고 연결설정 과정도 없기 때문이다. UDP 프로그램에서 주의할 것은, 한 쪽이 sendto()를 호출했으면 이 데이터를 받기 위해서 상대방은 반드시 recvfrom()을 호출하고 있어야 한다는 것이다. TCP 소켓에서는 스트림을 이용하므로 write()나 send()로 연속하여 쓰기를 수행하거나 read()나 recv()로 연속하여 읽기를 해도 문제가 되지 않지만, UDP에서는 sendto()와 recvfrom()의 호출이 서로 짝을 이루도록 순서가 맞아야 한다. #include #include #in..
이전 글 참고 UDP를 이용하는 에코 클라이언트 프로그램에서는 소켓을 UDP 타입으로 개설하는 부분과 에코 서버로 메시지를 보내고 받는 부분이 다음과 같이 달라진다. socket(PF_INET, SOCK_DGRAM, 0) … sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, addrlen) recvfrom(s, buf, MAXLINE, 0, (struct sockaddr *)&servaddr, &addrlen) udp_echocli.c #include #include #include #include #include #include #include #include #define MAXLINE 511 int main(int argc, char *ar..
tcp_echoserv.c TCP 소켓을 이용하여 에코 서비스를 제공하는 서버 프로그램이다. tcp_echoserv.c는 클라이언트의 접속요청을 수락한 후 바로 에코 서비스를 수행한다. 이 서버를 이용할 클라이언트 프로그램으로는 tcp_echocli.c를 사용하면 된다. #include #include #include #include #include #include #include #define MAXLINE 127 int main(int argc, char *argv[]) { struct sockaddr_in servaddr, cliaddr; int listen_sock; int accp_sock; // 소켓번호 int addrlen = sizeof(cliaddr); // 소켓주소 구조체 길이 int ..