2개의 쓰레드에서 read와 write를 각각 사용하는것에 대해 질문?

gamejigi의 이미지

다름이 아니라 연결리스트를 이용하여
3개의 쓰레드(main포함)을 생성해 사용자간에
파일 전송을 구현하려고 합니다.
(다중 파일 업로드. 한명의 사용자가 여러 사용자에게
파일을 보낼수도 있고 여러 파일을 동시에 받을수 있게)
말이 다중 파일 업로드지 클라이언트에서는 멀티플렉싱
을 이용해서 연결리스트에 등록되어 있는 파일들 보내고
받고 하는식으로 구현했는데요
서버쪽에서 문제가 있는거 같습니다.
제가 알기로 socket이 생성되면 2개의 수신과 송신
스트림이 생성된다고 알고 있는데요.
이 생성된 소켓 디스크립터를 전역변수로 지정해놓고
한개의 쓰레드에서는 read를 이용해 수신만 하여 연결리스트에
등록을 하고
한개의 쓰레드는 write를 이용해 등록된 연결리스트에서 값을
가져와 write를 합니다.
근데 문제가 파일이 제대로 전송되지가 않는군요.
read쪽에서 printf로 패킷을 전송받을때마다 출력하도록
하면 제대로 전송이 되는데 이 부분을 주석처리 하면 전송하다가
그냥 뻗어버립니다.
수신한 클라이언트 폴더를 보면 제대로 된 파일용량이 아니구요
(실제보다 2000~4000바이트 정도? 매번 변함)
write쓰레드에서는 연결리스트에 값이 등록되어 있지 않으면
송신을 안하도록 해놓았습니다.
하나의 소켓 디스크립터에 대해 생성된 2개의 스트림은 동시에
작업이 가능한걸로 아는데...
mutex로 read부분과 write부분도 제어를 해줘야 하나요?
ps.소스가 지금 없어서 못 올리는 점 양해 바랍니다.ㅠ.ㅠ

익명 사용자의 이미지

gamejigi wrote:

...
제가 알기로 socket이 생성되면 2개의 수신과 송신
스트림이 생성된다고 알고 있는데요.
...

1쌍의 송수신 스트림이 더 어울리는 표현입니다.
동일 socket descriptor로 송수신이 가능.

gamejigi wrote:

...
근데 문제가 파일이 제대로 전송되지가 않는군요.
read쪽에서 printf로 패킷을 전송받을때마다 출력하도록
하면 제대로 전송이 되는데 이 부분을 주석처리 하면 전송하다가
그냥 뻗어버립니다.
...

read에서 리턴값을 검사해보세요.
뻗어....
아~ 너무 문학적 표현이네요.
gamejigi wrote:

...
수신한 클라이언트 폴더를 보면 제대로 된 파일용량이 아니구요
(실제보다 2000~4000바이트 정도? 매번 변함)

윈도우에서 작업한 것이라면, 파일 오픈시 "b" 또는 O_BINARY를 기술해 주셨는지?
그리고, 이는 송수신 모듈의 에러일수 있습니다.
read/write의 리턴값을 매번 검사하는지 검토.
링크드리스트는 제대로 되어 있는가?
gamejigi wrote:

하나의 소켓 디스크립터에 대해 생성된 2개의 스트림은 동시에
작업이 가능한걸로 아는데...
mutex로 read부분과 write부분도 제어를 해줘야 하나요?

동시작업가능합니다.
현재 쓰레드 구조(읽기 전용, 쓰기전용; 읽는 쓰레드에서 쓰기 전혀 없으며, 쓰는 쓰레드에서 읽기 전혀 없음)라면, 뮤텍스는 필요없습니다.
익명 사용자의 이미지

단, 파일전송 프로토콜에서 양단간에 프로토콜 핸드쉐이킹을 수행한다면, 동기화가 필요하며, 이는 뮤텍스를 쓰건, 세마포를 쓰건, 시그널등을 쓰건간에 동기화를 맞춰줘야 합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.