Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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 29 30
Archives
Today
Total
관리 메뉴

codingfarm

4. 소켓 네트워크 프로그램 개발 - 7. 데이터 읽고 쓰기(read/write 함수) 본문

TCP IP 소켓 프로그래밍

4. 소켓 네트워크 프로그램 개발 - 7. 데이터 읽고 쓰기(read/write 함수)

scarecrow1992 2021. 5. 11. 22:55

 

클라이언트가 Connect 함수로 서버에 연결을 요청하면 이 요청은 서버의 수신 대기열에 들어간다.

서버에서 accept 함수로 연결을 가져오면 서버와 클라이언트가 연결되어 통신할 수 있는 상태가 된다.

 

데이터 통신은 읽기 함수와 쓰기 함수가 쓰인다.

다만, 단순한 읽기/쓰기 일지라도 크게 2가지 함수로 나뉜다.

  • 저수준 입출력 함수 : OS에서 제공하는 기본적인 함수
  • 소켓 입출력 함수 : 소켓에서 제공하는 함수

 

이 포스트에서는 OS에서 제공하는 저수준 입출력 함수에 대해서 알아볼것이다.

소켓에서 제공하는 입출력 함수는 12장에서 다룰것이다.

 


리눅스에서의 데이터 입출력

윈도우즈에서의 입출력은 여기를 참고할것

 

  • 리눅스에서는 소켓을 포함한 모든것을 파일로 다룬다.
  • 파일에 읽고 쓰기 위해 read와 write 라는 시스템 함수를 쓴다.

(소켓의 파일로서의 성질은 5장에서 볼것)

 

 

read 함수를 이용한 데이터 읽기

1
2
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
cs
  • fd : 열린 파일의 지정 번호, 소켓 프로그램에서는 fd 소켓 지정번호다
    • client : socket 함수로 생성된 소켓
    • server : accept 함수로 생성된 소켓
  • buf : 읽어들인 데이터가 저장될 버퍼 변수
  • count : 읽어들일 데이터의 count 크기
  • 반환값
    • 성공 : 읽어들인 데이터의 크기(byte단위)
    • 실패 : -1
read 함수는 파일(여기서는 소켓)에서 count 크기 만큼의 데이터를 읽어서 buf에 저장하는 일을 한다.

read 함수를 이용하여 sockfd로부터 80바이트의 데이터를 읽는 방법이다.

1
2
3
4
int readn;
char buf[80];
memset(buf, 0x0080);
readn = read(sockfd, buf, 80);
cs

 

 

write 함수를 이용한 데이터 쓰기

1
2
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
cs
  • fd : 연결된 소켓 지정 번호
  • buf : 보낼 데이터가 저장된 버퍼
  • count : 보낼 데이터의 크기
  • 반환 값 : 성공하면 쓴 데이터의 크기, 실패하면 -1
write 함수는 buf에서 count 크기만큼의 데이터를 파일 fd에 작성하는 일을 한다

write 함수를 이용해서 데이터를 쓰는 예제 코드

1
2
3
4
5
6
7
8
9
10
struct user_info {
    int age;
    char name[25];
}
 
...
struct user_info mydata;
mydata.age = htonl(25);
strcpy(mydata.name, "hello world\0");
writen = write(fd, (void *&mydata, sizeof(mydata));
cs

 


시스템 함수

현대적인 OS들은 시스템 모드와 유저 모드두 영역으로 나뉜다.

  • 시스템 모드 
    • 커널이 관리하는 영역
    • 여러 주요 시스템 자원을 직접 관리할 수 있음
  • 유저 모드
    • 프로그램을 처음 실행하면 진입하는 모드
    • 시스템 자원(디스크, 메모리, 이더넷카드, 사운드 카드...)에 접근 불가

사용자가 임의로 특정 프로그램을 직접 시스템 모드로 진입하게 하는것은 매우 위험하다.

그러므로 OS에서는 유저 프로그램이 직접 시스템모드로 진입하는 대신, 시스템자원을 사용하기 위한 요청을 커널에 할 수 있도록 시스템 함수 혹은 시스템 호출(system call)라는 명령어 셋을 지원한다.

시스템 함수는 사용이 번거로우므로, 이를 쉽게 쓸 수 있도록 포장한 '사용자 라이브러리'를 이용하여 개발한다.

윈도우에서는 Win32 API가 리눅스의 시스템 콜의 역할을 한다.

 

 

 

 

 

 

Comments