티스토리 뷰

190711
 
파일입출력,
클라->서버 (파일저장)
 

본 글은 교육을 받으며 정리한 내용을 그대로 올린 것 입니다.


 
● File IO
개행을 표시할 때
\r : 캐리지 리턴(CR) (다시 앞으로 땡기는 작업)
\n : 라인 피드(LF) (타자기계에서 위로 올리는 작업)
파일 저장시 위 두개를 모두 해야한다. \r\n으로 저장을 해야한다.
ABC
BCD
= ABC\r\nBCD\r\n 으로 저장이되어 모두 10byte로 저장된다.
1.텍스트모드
텍스트 모드는 자동으로 위(\r\n)을 변환시켜준다.
즉 \n과 \r\n의 관계다.
로그파일 만들 때 많이 쓴다.
2.바이너리모드
데이터를 저장할 목적으로 사용된다. 주로사용.
읽어온 만큼 다시 그대로 저장하려면 바이너리모드를 쓴다.
 
● 파일 IO를 하는 이유 2가지
1. 정보저장을 목적으로 (바이너리로 보관)
2. Report 문서 읽기 (텍스트로 보관)
ex) 2,000,500 저장시 텍스트는 한자 한자 그대로 저장..
 
텍스트 모드라 10이 13,10 으로 바뀐다. \r\n 이렇게된다. 그래서 5바이트
 
 
#include <stdio.h>
int main() {
    FILE* pf;
    fopen_s(&pf, "D:\\project\\NetWork_Source\\FileIO\\src.jpg", "rb");
 
    fseek(pf, 0, SEEK_END);//파일의 기준위치를 가장 끝으로 보내고 (파일 포지션)
    //fseek(pf, 100, SEEK_SET);//시작위치부터 100만큼 파일 포지션 이동
    int size = ftell(pf);// 파일 포지션 위치를 읽는다. 그럼 파일의 크기다.
    printf("size : %d\n", size);
    fclose(pf);
}
 
 
#include <stdio.h>
int main() {
    FILE* pf;
    fopen_s(&pf, "D:\\project\\NetWork_Source\\FileIO\\src.jpg", "rb");
 
    fseek(pf, 0, SEEK_END);//파일의 기준위치를 가장 끝으로 보내고 (파일 포지션)
    //fseek(pf, 100, SEEK_SET);//시작위치부터 100만큼 파일 포지션 이동
    int size = ftell(pf);// 파일 포지션 위치를 읽는다. 그럼 파일의 크기다.
    fseek(pf, 0, SEEK_SET);
 
    char* buf = new char[size];
    fread(buf, size, 1, pf);
    fclose(pf);
 
    fopen_s(&pf, "D:\\project\\NetWork_Source\\FileIO\\target.jpg", "wb");
    fwrite(buf, size, 1, pf);
    fclose(pf);
 
    delete[] buf;
}
파일 복사
 
오늘 한 예제(파일보내기)는 2G 까지만된다.
32bit는 메모리를 4G까지만 만들 수 있다. (사용자 메모리는 2G)
64bit는 거의 제한이 없다.

IOCP는 중요하다. 윈도게임서버 등은 모두다 IOCP로 개발이 되었다.
 
  • 윈도우 소켓 라이브러리
2개의 MODE
  1. 블로킹 모드
  2. Non블로킹 모드
6개의 I/O Model
  1. 블로킹 모드 (쓰레드 사용 다중처리)
  2. Select 모델 : 2번 까지는 mac이나 리눅스에서도 돌아간다.
  3. WSAAsyncSelect
  4. WSAEventSelect
  5. Overlapped(이벤트 완료보고/완료루틴)
  6. IOCP(Input Output Completion Port)
 
non-blocking : 함수의 목적이 달성되지 않았어도 blocking 되지 않고 바로 반환(return)된다.
목적이 달성 됬는지 추적하여 관리해야한다.
 
    // 넌블로킹 소켓으로 전환
    u_long on = 1;
    retval = ioctlsocket(listen_sock, FIONBIO, &on);
    if(retval == SOCKET_ERROR) err_quit("ioctlsocket()");
기본적(default)으로는 블로킹인 대기 소켓의 속성을 넌블로킹 소켓으로 전환한다.
FIONBIO : 플래그 IO 소켓모델 -> 논 블로킹 IO 소켓으로 바꾸겠다.
이후 대기소켓이 넌 블로킹이므로 해당 소켓으로 만들어진 통신소켓 또한 넌-블로킹으로 생성된다.
 
client_sock = accept(listen_sock, (SOCKADDR *)&clientaddr, &addrlen);
if(client_sock == INVALID_SOCKET){
    if(WSAGetLastError() != WSAEWOULDBLOCK) //진짜 에러이 경우 에러처리
        err_display("accept()");
    continue;//WSAEWOULDBLOCK일경우 continue
}
접속하지 않는한 계속 LOOP 한다. (CPU 과부하 가능) -> 어떤 다른 매커니즘과 같이 사용하지 않는한 비효율 적이다. -> 그래서 IO모델과 결합이되게된다.
댓글
댓글쓰기 폼
네이버 이웃추가
«   2019/10   »
    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 31    
글 보관함