파일을 전송하는 소켓프로그래밍 질문요
글쓴이: brian.ryu / 작성시간: 화, 2005/12/27 - 10:22오전
간단한 소켓프로그래밍(메시지 전송등...)을 배우고 있는데,
문득 '어차피 네트워크 통신이니 소켓 프로그래밍에서도 파일 전송이 가능하겠네....' 라고 생각 했죠...
아마도 당연할 텐데... 어떻게 접근해야 할지 모르겠네요...
소켓 프로그래밍 책을 보면 주로 '메시지 주고받는 예제' 가 고작인지라 잘 모르겠네요...
어떤 책이라든지, 소스라든지, 웹 사이트라든지 도움이 될 만한 정보를 구합니다.
읽어주셔서 감사합니다.
Forums:
참고로 개발환경은 RedHat 9 (kernel 2.4.20-8 입니다.)
참고로 개발환경은 RedHat 9 (kernel 2.4.20-8 입니다.)
그 메세지를 파일 내용으로하면 되죠.. 보내는쪽은 파일을 읽어서 그 내용
그 메세지를 파일 내용으로하면 되죠.. 보내는쪽은 파일을 읽어서 그 내용을 보내는거고 받는쪽은 그걸 받아서 파일로 저장하구요.. 그전에 서로간에 파일이름과 크기등의 정보를 주고 받는 루틴도 필요할테구요..
======================
BLOG : http://superkkt.com
다른 궁금증
초보의 질문임을 인지하여 주시고....
그렇다면, FTP에서의 Binary 나 Ascii 구분은 어떻게 하나요?
앗 저도 필요한 부분인데, 혹시 좋은 예제 같은 거 없을까요? 간단한 F
앗 저도 필요한 부분인데, 혹시 좋은 예제 같은 거 없을까요? 간단한 FTP 클라이언트 서버 정도.... -_-;;;
FTP프로토콜을 직접 구현하시려면 꽤 귀찮지 않을까요 ?FTP프로토콜
FTP프로토콜을 직접 구현하시려면 꽤 귀찮지 않을까요 ?
FTP프로토콜을 구현해 놓은 라이브러리 같은걸 구해서 쓰시는 것이 어떨지...
간단하게 하시려면 만들어 놓은 메세지 보내는 프로그램을 살짝 바꿔서 파일의 바이너리 내용을 보내시는게 하는게 좋을 듯 하네요...
그리고 소켓으로 데이터를 보낼 때는 무조건 바이너리 아니었나요 ?
통신 데이터가 Binary 일 때는 통신 제어코드와 자료코드간의 구별이
통신 데이터가 Binary 일 때는 통신 제어코드와 자료코드간의 구별이 문제가 되겠지요.
이럴 때는 보통 2개의 소켓을 열어서 통신하는 것을 추천합니다.
하나의 소켓은 제어 신호만을 주고 받고, 다른 하나는 데이터가 이동하는 것이지요.
실제 FTP 도 이렇게 구현이 되어 있습니다. 그래서 리슨 포트가 20, 21 두개가 필요한거죠.
USB 도 위의 방식 처럼 여러개의 회선을 이용해서 통신을 합니다.
만약 하나만 열고 싶으시다면, email 에서 7비트 코드만을 처리 해주는 구형 이멜서버에서 8비트 데이터(이메일에 파일 첨부기능, 멀티바이트 문자셋등)를 지원하기 위해 이용하는 테크닉을 그대로 이용하시면 되는데요.
즉 base64 와 같은 코덱을 이용해서 데이터를 모두 7비트 이하 코드로 인코딩하고, 제어 코드를 그 외의 8비트 코드를 이용해서 통신하는 방법도 있지만, 이건 전송량이 증가하는 단점이 있으므로 전송량이 많다면 비추입니다.
[quote="ssehoony"]통신 데이터가 Binary 일 때는 통신
님께서 말씀하신 제어코드라 함은
예를 들자면 어떤게 있을가요?
[quote="Anonymous"][quote="ssehoony"]통신
프로토콜을 말슴하시는 것 같네여.
그러니깐.
클라이언트와 서버의 행동에 관한 프로토콜을 한포트열고
데이터전송 한포트열고 ...
맞나여??? :oops:
---------------------------------------
blog : http://myohan.egloos.com
전송의 시작을 알리거나전송중에 전송 중단을 알리거나 전송하려는 데
전송의 시작을 알리거나
전송중에 전송 중단을 알리거나
전송하려는 데이터의 사이즈나
파일명 혹은 무슨 데이터인지 ID 코드 등등의
전송 데이터의 body 를 제외한 그 외의 다른 것들을 의미합니다.
그 구현 내용에 따라 약간씩 달리지겠지요.
위에서 가장 중요한 것은 전송 중단을 알리기 위함입니다.
ftp 처럼 전송량이 대용량일때 이런게 중요합니다.
전송할 용량이 작아서 중간에 임의로 중단하는 일이 없다면,
그냥 하나의 소켓으로 통신해도 상관이 없죠.
송수신중에 데이터 통신을 중단을 상대방에 알리는 방법으로 소켓을 끊는 방법이 있는데,
장애로 인해 끊긴건지 전송을 중단하기 위해 상대방이 끊은건지 구별할 필요도 없고,
다른 작업을 위해 다시 재접속하는 부하가 그리 부담 되지 않는 상황이라면
소켓을 끊는 방법을 이용하는 것도 하나의 방법일 수 있습니다.
에휴,...
소켓을 이용하여 파일을 전송하시려 한다면 파일전송 프로토콜을 간단하게 정의를 하시지여.. 그게 오래 살 수 있는 비결입니다.^^
S2C: 서버에서 클라이언트로.
C2S: 클라이언트에서 서버로.
1. 클라이언트와 서버간의 연결을 한다.
2. S2C: Greeting Message를 보낸다.
3. C2S: 파일정보(메타정보)를 보낸다. 몇개의 덩어리로 나눌것인지 고려한다.
4. S2C: OK
5. C2S: 몇개의 덩어리를 보낸다.(MTU를 고려한다.)
6. S2C: OK Go ahead... Delay가 필요할 경우 Delay요구를 한다.
7. 5번과 6번을 반복한다.
8. C2S: close()
9. S2C: close() in select()
서버에서 select()를 사용한다면 굳이 전송중단을 걱정안해도 감지할 수 있져.
ps: FTP처럼 두개의 포트를 사용할 생각일랑 아예 마시길,... FTP 방식은 개발자뿐만 아니라 네트웍 보안 관계자들의 두통의 원인 입니다.
-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----
뭐 거창하게 FTP 라고 할것까진 없고,소켓프로그래밍을 통해 원격
뭐 거창하게 FTP 라고 할것까진 없고,
소켓프로그래밍을 통해 원격지에 접근하고,
ls 명령어 정도를 통해 해당 디렉토리 보여주고(또는 다른 방법으로 - 파일이 기본적으로 화명에 보여진다든지)
해당파일을 다운로드 명령을 주어 로컬 디렉토리로 다운로드 하고자 하는 정도의 수준입니다.
즉, 간단히 생각해보면 웹에서 어떤 파일 선택하면 다운로드되는 것과 같은 이치라고 보시면 될것 같네요...
차근차근 메시지 전송 파일을 다시 훌터 보고는 있고요...
혹시 좋은 사이트나 예제 파일들이 있으면 참고자료로 알려주세요...
댓글 달기