소켓프로그래밍 2
<데이터를 읽거나 쓰기 위해 파일을 열 떄 사용하는 함수>
int open(const char *path, int flag);
이 함수는 파일을 열 떄 사용하는 함수입니다. 첫번쨰 인자로는 파일의 이름및 경로 정보를 두번쨰는 파일의 오픈 정보를 전달합니다.
이 함수를 쓰기위해서는 <sys/types.h>와 <sys/stat.h> 그리고 <fcntl.h>를 include해야 한다.
성공시 파일 디스크립터를 하고 실패하면 -1을 반환합니다.
파일의 오픈 정보
1. O_CREAT 필요하면 파일을 생성
2. O_TRUNC 기존의 데이터 전부 삭제
3. O_APPEND 기존 데이터 보존하고, 뒤에 이어서 저장
4. O_RDONLY 읽기전용으로 파일 오픈
5. O_WRONLY 쓰기 전용으로 파일 오픈
6. O_RDWR 일기, 쓰기 겸용으로 파일 오픈
또한 오픈전보를 or연산자로 묶어서 전달할수 있다.
만약 파일생성하고 쓰기 전용으로 열고 싶다면 O_CREAT|O_WRONLY이런식으로 쓰는게 가능합니다.
int close(int fd);
파일을 닫을때 사용하는 함수로서 인자로 파일이름이나 파일 디스크립터를 주면 되는 것 같다.
이 함수를 쓰기 위해서는 <unist.h>를 불러주어야 한다.
성공시 0 실패시 -1을 반환합니다.
ssize_t write(int fd, const void * buf, size_t nbytes);
파일에 데이터를 전송하는 함수이다. 그리고 리눅스에서는 파일과 소켓을 동일하게 취급하기 떄문에 다른 컴퓨터에 전송할때도 이 함수를 사용하여 보내줄수 있습니다.
이 함수를 쓰기 위해서는 <unistd.h>를 include해주어야 한다.
wirte(파일디스크립터 전달, 버장된 버퍼의 주소값전달, 전송할 데이터의 바이트수 전달)
성공하면 수신한 바이트 수를 실패하면 -1을 반환합니다.
ssize_t read(int fd, void *buf,size_t nbytes);
파일의 데이터를 수신하는 함수입니다.
이 함수를 쓰기위해서는 <unistd.h>를 include 해야합니다.
인자로 들어가는 것은 write함수와 같습니다.
성공하면 수신한 바이트 수를 실패하면 -1을 반환합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> void error_handling(char* message); int main(void){ int fd; char buf[]="Let's go!\n"; fd=open("data.txt",O_CREAT|O_WRONLY|O_TRUNC); if(fd==-1) error_handling("open error"); printf("file descriptor: %d \n",fd); if(write(fd,buf,sizeof(buf))==-1) error_handling("write error!"); close(fd); return 0; } void error_handling(char* message){ fputs(message,stderr); fputc('\n',stderr); exit(1); } | cs |
파일을 생성하고 파일 데이터를 저장하는 프로그램이다. <출처 열혈 tcp/ip 프로그래밍 low_open.c>
위의 예제를 실행하면 data.txt라는 파일이 생기고 data파일에는 Let's go!가 써져 있고 파일 디스럽터는 3이라고 나오게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #define BUF_SIZE 100 void error_handling(char *message); int main(void){ int fd; char bf[BUF_SIZE]; fd=open("data.txt",O_RDONLY); if(fd == -1) error_handling("open error"); printf("FILE DESCIPTER : %d \n",fd); if(read(fd,bf,sizeof(bf))==-1) error_handling("read error"); printf("file data : %s",bf); close(fd); return 0; } void error_handling(char *message){ fputs(message,stderr); fputc('\n',stderr); exit(1); } | cs |
위의 예제는 앞선 예제에서 만든 data.txt를 읽기전용으로 열어 읽는 코드이다. <출처 열혈 tcp/ip 프로그래밍>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <sys/socket.h> int main(void){ int fd1,fd2,fd3; fd1=socket(PF_INET,SOCK_STREAM,0); fd2=open("test.dat",O_CREAT|O_WRONLY|O_TRUNC); fd3=socket(PF_INET,SOCK_DGRAM,0); printf("file descriptor 1: %d\n",fd1); printf("file descriptor 2: %d\n",fd2); printf("file descriptor 3: %d\n",fd3); close(fd1); close(fd2); close(fd3); return 0; } | cs |
위의 예제는 파일도 생성하고 소켓도 생성한다음 파일 디스크립터의 값을 정수 형태로 비교해보는 예제이다. <출처 열혈 tcp/ip 프로그래밍>
'소켓' 카테고리의 다른 글
소켓 프로토콜과 데이터 전송 특성 (0) | 2018.06.27 |
---|---|
소켓프로그래밍 3 윈도우 (0) | 2018.06.25 |
소켓프로그래밍1 리눅스 (1) | 2018.06.24 |