본문 바로가기

소켓

소켓프로그래밍2 리눅스

소켓프로그래밍 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