목록유닉스 (48)
K 개발자
포트번호는 TCP 소켓인 경우는 connect() 호출이 성공한 후에, UDP 소켓의 경우는 첫 번째 메시지를 보내는 sendto() 함수가 성공한 후에 배정된다. 아래는 이것을 확인하는 예제 프로그램인데 TCP와 UDP 클라이언트에서 시스템이 배정한 포트번호를 getsockname()을 이용하여 얻은 후 화면에 출력하고 있다. 참고로 getsockname()은 자신의 호스트에 있는 소켓 정보를 알아내는 함수인데 TCP로 연결된 상대방의 소켓 정보를 얻으려면 getpeername()을 사용하면 된다. port_number.c port_number.c가 실행되기 위해서는 서버에서 TCP 및 UDP 에코 서비스가 동작하고 있어야 한다. #include #include #include #include #inc..
tcp_echocli.c TCP 클라이언트 프로그램의 예로 에코 서비스를 이용하는 클라이언트 프로그램이다. 표준 인터넷 서비스인 에코는 well-known 포트 7번을 통해 제공되며 클라이언트가 보낸 문자열을 다시 클라이언트로 전송한다. connect()를 호출한 후 서버와 연결이 완료되면 서버로 전송할 문자열을 키보드를 통해 아래와 같이 입력받는다. fgets(buf, sizeof(buf), stdin); fgets() 함수는 스트링 문자열을 입력받는 함수로 첫 번째 인자(buf)는 문자열을 저장할 버퍼이고, 두 번째 인자는 버퍼의 크기, 그리고 세 번째 인자는 입력 스트림 포인터이다. 입력 스트림 포인터로 stdin을 지정하였는데 stdin은 FILE 포인터 타입의 전역변수로 표준 입력 파일인 키보드..
mydaytime.c 유닉스 서버가 제공하는 daytime 서비스를 이용하는 클라이언트 프로그램이다. #include #include #include #include #include #include #include #include #include #include #define MAXLINE 127 int main(int argc, char *argv[]) { int s, nbyte; struct sockaddr_in servaddr; char buf[MAXLINE + 1]; if (argc != 2) { printf("Usage: %s ip_address\n", argv[0]); exit(0); } // 소켓 생성 if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) { p..
도메인 네임으로부터 IP 주소를 얻거나 IP 주소로부터 해당 호스트의 도메인 네임을 얻으려면 DNS(Domain name Service) 서버의 도움을 받아야 한다. #include struct hostent *gethostbyname(const char *hname); struct hostent *gethostbyaddr(const char *in_addr, int len, int family); gethostbyname()은 도메인 네임 hname을 스트링 형태로 입력받고(예를 들면 "www.github.com") 그 이름에 해당하는 호스트의 각종 정보를 가지고 있는 hostent 구조체의 포인터를 리턴한다. gethostbyaddr()은 IP 주소를 포함하고 있는 구조체 in_addr의 포인터와 이..
4 바이트(32비트)의 IP 주소를 편의에 따라 www.github.com과 같은 도메인 네임 또는 52.78.231.108과 같은 dotted decimal 방식으로 표현하여 사용한다. dotted decimal 표현을 저장하기 위해서는 숫자 변수가 아니라 15개의 문자로 구성된 스트링 변수가 사용된다. 주의할 것은 IP 데이터그램을 네트워크로 실제로 전송할 때 IP 헤더에는 4 바이트의 (binary) IP 주소만 사용할 수 있다. dotted decimal로 표현된 52.78.231.108을 32비트의 IP 주소로 변환하려면 inet_pton() 함수를 사용하고, IP 주소를 dotted decimal로 변환하려면 inet_ntop()를 사용한다. ntop는 mumerical to presentat..
바이트 순서(byte order)에는 호스트 바이트 순서와 네트워크 바이트 순서 두 가지가 있다. 호스트 바이트 순서는 컴퓨터가 내부 메모리에 숫자를 저장하는 순서를 말하는데, 이것은 CPU의 종류에 따라 다르다. 네트워크 바이트 순서는 포트번호나 IP 주소와 같은 정보를 바이트 단위로 네트워크로 전송하는 순서를 말한다. 바이트 순서를 바꾸는 함수에는 변환할 바이트 길이가 2 바이트인 경우 또는 4 바이트인 경우에 따라 다음과 같이 두 가지 종류가 있다. Unsigned short interger 변환 (2 바이트 크기) htons(): host-to-network 바이트 변환 ntohs(): network-to-host 바이트 변환 Unsigned long interger 변환 (4 바이트 크기) ht..
소켓 프로그래밍에서 첫 번째로 해야 할 일은 통신 창구 역할을 하는 소켓을 만드는 것이다. 이것은 서버와 클라이언트에서 모두 필요한데 이를 위하여 socket() 함수를 이용한다. socket()이 성공적으로 수행되면 새로 만들어진 소켓번호를 리턴하고 에러가 발생하면 -1이 리턴되며 이때 전역변수 errno에 에러코드가 들어간다. socket()의 사용 문법은 다음과 같다. #include int socket( int domain, // 프로토콜 체계 int type, // 서비스 타입 int protocol // 소켓에서 사용할 프로토콜 ) domain으로 지정할 수 있는 프로토콜 체계에는 다음과 같은 것이 있다. PF_INET (인터넷 프로토콜 체계 사용) PF_INET6 (IPv6 프로토콜 체계 사..
세마포어의 기본 개념 세마포어semaphore는 프로세스 사이의 동기synchronization를 맞추는 기능을 제공한다. 예를 들어, 공유 메모리에 여러 프로세스가 동시에 쓰기를 시도한다면 데이터가 손상되는 현상이 발생한다. 따라서 여러 프로세스 사이의 동작 순서를 지정해야 한다. 프로세스들이 공유 영역에 대한 접근 순서를 정하는 방법 중 하나가 세마포어다. 세마포어의 기본 동작 구조 세마포어는 중요한 처리 부분critical section에 들어가기 전에 p 함수를 실행해 잠금 기능을 수행하고, 처리를 마치면 다시 v 함수를 실행해 잠금을 해제한다. 잠금 기능을 수행 중인 동안에는 다른 프로세스가 처리 부분의 코드를 실행할 수 없다. sem은 세마포어 값을 의미한다. p(sem); /* 잠금 */ 중..