파일을 전송하는 소켓프로그래밍 질문요

brian.ryu의 이미지

간단한 소켓프로그래밍(메시지 전송등...)을 배우고 있는데,
문득 '어차피 네트워크 통신이니 소켓 프로그래밍에서도 파일 전송이 가능하겠네....' 라고 생각 했죠...

아마도 당연할 텐데... 어떻게 접근해야 할지 모르겠네요...

소켓 프로그래밍 책을 보면 주로 '메시지 주고받는 예제' 가 고작인지라 잘 모르겠네요...

어떤 책이라든지, 소스라든지, 웹 사이트라든지 도움이 될 만한 정보를 구합니다.

읽어주셔서 감사합니다.

brian.ryu의 이미지

참고로 개발환경은 RedHat 9 (kernel 2.4.20-8 입니다.)

superkkt의 이미지

그 메세지를 파일 내용으로하면 되죠.. 보내는쪽은 파일을 읽어서 그 내용을 보내는거고 받는쪽은 그걸 받아서 파일로 저장하구요.. 그전에 서로간에 파일이름과 크기등의 정보를 주고 받는 루틴도 필요할테구요..

======================
BLOG : http://superkkt.com

brian.ryu의 이미지

초보의 질문임을 인지하여 주시고....

그렇다면, FTP에서의 Binary 나 Ascii 구분은 어떻게 하나요?

kiwist의 이미지

앗 저도 필요한 부분인데, 혹시 좋은 예제 같은 거 없을까요? 간단한 FTP 클라이언트 서버 정도.... -_-;;;

익명 사용자의 이미지

FTP프로토콜을 직접 구현하시려면 꽤 귀찮지 않을까요 ?
FTP프로토콜을 구현해 놓은 라이브러리 같은걸 구해서 쓰시는 것이 어떨지...

간단하게 하시려면 만들어 놓은 메세지 보내는 프로그램을 살짝 바꿔서 파일의 바이너리 내용을 보내시는게 하는게 좋을 듯 하네요...
그리고 소켓으로 데이터를 보낼 때는 무조건 바이너리 아니었나요 ?

ssehoony의 이미지

통신 데이터가 Binary 일 때는 통신 제어코드와 자료코드간의 구별이 문제가 되겠지요.

이럴 때는 보통 2개의 소켓을 열어서 통신하는 것을 추천합니다.
하나의 소켓은 제어 신호만을 주고 받고, 다른 하나는 데이터가 이동하는 것이지요.
실제 FTP 도 이렇게 구현이 되어 있습니다. 그래서 리슨 포트가 20, 21 두개가 필요한거죠.
USB 도 위의 방식 처럼 여러개의 회선을 이용해서 통신을 합니다.

만약 하나만 열고 싶으시다면, email 에서 7비트 코드만을 처리 해주는 구형 이멜서버에서 8비트 데이터(이메일에 파일 첨부기능, 멀티바이트 문자셋등)를 지원하기 위해 이용하는 테크닉을 그대로 이용하시면 되는데요.
즉 base64 와 같은 코덱을 이용해서 데이터를 모두 7비트 이하 코드로 인코딩하고, 제어 코드를 그 외의 8비트 코드를 이용해서 통신하는 방법도 있지만, 이건 전송량이 증가하는 단점이 있으므로 전송량이 많다면 비추입니다.

익명 사용자의 이미지

ssehoony wrote:
통신 데이터가 Binary 일 때는 통신 제어코드와 자료코드간의 구별이 문제가 되겠지요.

이럴 때는 보통 2개의 소켓을 열어서 통신하는 것을 추천합니다.
하나의 소켓은 제어 신호만을 주고 받고, 다른 하나는 데이터가 이동하는 것이지요.
실제 FTP 도 이렇게 구현이 되어 있습니다. 그래서 리슨 포트가 20, 21 두개가 필요한거죠.
USB 도 위의 방식 처럼 여러개의 회선을 이용해서 통신을 합니다.

만약 하나만 열고 싶으시다면, email 에서 7비트 코드만을 처리 해주는 구형 이멜서버에서 8비트 데이터(이메일에 파일 첨부기능, 멀티바이트 문자셋등)를 지원하기 위해 이용하는 테크닉을 그대로 이용하시면 되는데요.
즉 base64 와 같은 코덱을 이용해서 데이터를 모두 7비트 이하 코드로 인코딩하고, 제어 코드를 그 외의 8비트 코드를 이용해서 통신하는 방법도 있지만, 이건 전송량이 증가하는 단점이 있으므로 전송량이 많다면 비추입니다.

님께서 말씀하신 제어코드라 함은
예를 들자면 어떤게 있을가요?

myohan의 이미지

Anonymous wrote:
ssehoony wrote:
통신 데이터가 Binary 일 때는 통신 제어코드와 자료코드간의 구별이 문제가 되겠지요.

이럴 때는 보통 2개의 소켓을 열어서 통신하는 것을 추천합니다.
하나의 소켓은 제어 신호만을 주고 받고, 다른 하나는 데이터가 이동하는 것이지요.
실제 FTP 도 이렇게 구현이 되어 있습니다. 그래서 리슨 포트가 20, 21 두개가 필요한거죠.
USB 도 위의 방식 처럼 여러개의 회선을 이용해서 통신을 합니다.

만약 하나만 열고 싶으시다면, email 에서 7비트 코드만을 처리 해주는 구형 이멜서버에서 8비트 데이터(이메일에 파일 첨부기능, 멀티바이트 문자셋등)를 지원하기 위해 이용하는 테크닉을 그대로 이용하시면 되는데요.
즉 base64 와 같은 코덱을 이용해서 데이터를 모두 7비트 이하 코드로 인코딩하고, 제어 코드를 그 외의 8비트 코드를 이용해서 통신하는 방법도 있지만, 이건 전송량이 증가하는 단점이 있으므로 전송량이 많다면 비추입니다.

님께서 말씀하신 제어코드라 함은
예를 들자면 어떤게 있을가요?


프로토콜을 말슴하시는 것 같네여.

그러니깐.
클라이언트와 서버의 행동에 관한 프로토콜을 한포트열고
데이터전송 한포트열고 ...
맞나여??? :oops:

---------------------------------------
blog : http://myohan.egloos.com

ssehoony의 이미지

전송의 시작을 알리거나
전송중에 전송 중단을 알리거나
전송하려는 데이터의 사이즈나
파일명 혹은 무슨 데이터인지 ID 코드 등등의
전송 데이터의 body 를 제외한 그 외의 다른 것들을 의미합니다.
그 구현 내용에 따라 약간씩 달리지겠지요.

위에서 가장 중요한 것은 전송 중단을 알리기 위함입니다.
ftp 처럼 전송량이 대용량일때 이런게 중요합니다.
전송할 용량이 작아서 중간에 임의로 중단하는 일이 없다면,
그냥 하나의 소켓으로 통신해도 상관이 없죠.

송수신중에 데이터 통신을 중단을 상대방에 알리는 방법으로 소켓을 끊는 방법이 있는데,
장애로 인해 끊긴건지 전송을 중단하기 위해 상대방이 끊은건지 구별할 필요도 없고,
다른 작업을 위해 다시 재접속하는 부하가 그리 부담 되지 않는 상황이라면
소켓을 끊는 방법을 이용하는 것도 하나의 방법일 수 있습니다.

wfellow의 이미지

소켓을 이용하여 파일을 전송하시려 한다면 파일전송 프로토콜을 간단하게 정의를 하시지여.. 그게 오래 살 수 있는 비결입니다.^^

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 방식은 개발자뿐만 아니라 네트웍 보안 관계자들의 두통의 원인 입니다.

-----[꼬릿말 절취선 시작]-----
삽질전에 먼저 구글신께 기도하자.
-----[꼬릿말 절취선 끝]-----

brian.ryu의 이미지

뭐 거창하게 FTP 라고 할것까진 없고,

소켓프로그래밍을 통해 원격지에 접근하고,
ls 명령어 정도를 통해 해당 디렉토리 보여주고(또는 다른 방법으로 - 파일이 기본적으로 화명에 보여진다든지)

해당파일을 다운로드 명령을 주어 로컬 디렉토리로 다운로드 하고자 하는 정도의 수준입니다.

즉, 간단히 생각해보면 웹에서 어떤 파일 선택하면 다운로드되는 것과 같은 이치라고 보시면 될것 같네요...

차근차근 메시지 전송 파일을 다시 훌터 보고는 있고요...
혹시 좋은 사이트나 예제 파일들이 있으면 참고자료로 알려주세요...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.