File/Socket input and output in C language on Linux (리눅스에서 파일 입출력)


리눅스에서 소켓은 파일과 동일하게 조작된다. 그러므로 파일입출력에 사용되는 함수를 소켓 입출력에 사용할 수 있다. (윈도우는 소켓과 파일을 구분한다.)

파일 디스크립터(핸들)는 소켓 마나 하나 씩 고유하게 부여된다.
0: 표준입력
1: 표준출력
2: 표준에러

파일을 열때 사용하는 함수
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *path, int flag);
//path : 파일 이름 문자열, 주소
// flag : 파일 열기 모드
// 성공시 파일 디스크립터 return 아닐시엔 -1

파일(소켓)을 닫을 때 사용하는 함수
#include <unistd.h>

int close(int fd);

중요한 점은 파일을 다 사용하고 난 뒤에는 반드시 닫아주어야 한다는 점이다.

파일에 데이터 쓰는 함수
#include <unistd.h>

ssize_t write(int fd, const void * buf, size_t nbytes);
//buf 전송할 데이터가 저장된 버퍼의 주소
//nbytes 전송할 데이터 바이트 수
//ssize_t == signed int
//성공하면 전달한 바이트수 return

typedef로 재정의 해준 ssize_t는 정수 바이트가 다른 환경에서의 코드 수정을 최소화 해준다. 이때 붙여진 _t는 시스템에서 정의된 것을 의미한다.

또 소켓을 여기에 사용하면 다른 컴퓨터에 전송시 사용도 가능하다. 그 다음은 데이터를 수신하는 방법이다.
#include <unistd.h>

ssize_t read(int fd, void * buf, size_t nbytes);
//성공하면 수신한 바이트 수 return (실패는 -1, 이건 위 함수들 동일)
함수인자는 파일 디스크립터, 수신 받을 버퍼주소, 수신할 최대 바이트 수 를 정해준다.

write로 버퍼에 저장된 내용을 파일에 썼다면 read로 그 파일에 저장된 데이터를 (버퍼에)읽어올 수 있다.
리눅스에서는 소켓과 파일을 동일하게 조작하므로 소켓에도 똑같이 사용할 수 있다.

실제로 생성해보면 파일,소켓 생성시 순서대로 3부터 넘버링하는 것을 확인할 수 있다. 012는 표준 디스크립터로 사용되고 있기 때문에 3부터 숫자가 매겨지는 것이다.




File/Socket input and output in C language on Linux (리눅스에서 파일 입출력) File/Socket input and output in C language on Linux (리눅스에서 파일 입출력) Reviewed by Lifer on 8/30/2018 Rating: 5

댓글 없음:

Powered by Blogger.