socket 프로그램 초보 질문..^^"

psjcap의 이미지

socket이랑 pthread로 서버를 만들려고 합니다..
문법적인 내용이나 함수 사용 등보다는 프로그램 구조 잡는게 무지 어렵네요..ㅠㅠ

우선 연결된 소켓들을 묶어서 select를 합니다..
read할 data가 있으면 읽어서 특정 thread로 보내줍니다..
그럼 특정 thread에서 data를 처리한 후 결과를 client로 보내줍니다...
그런데.. 꼭 client에서 먼저 data를 보내면 그거에 대한 응답을 보내는 것이 아니라.. server가 먼저 data를 보내는 경우도 있습니다..

즉 recv로 블록되어 있다가 data가 오면 처리해서 send 하는 구조가 아니라는 건데요..
그래서 recv하는 thread가 있고.. 서버에서 특정한 동작을 하게 되면 client로 전송하는 thread가 있습니다..

여기서 궁금한 점은..
1. 두개의 thread에서 send/recv를 한 소켓에 동시에 수행하였을 경우 문제가 없는지요..
2. select하고 있는 socket에서 다른 thread에서 send/recv를 수행할 경우에 문제가 없는지요..

thread가 가끔 이상한 동작을 하는 관계로..ㅠㅠ

그럼 좋은 하루 되셔요..^_____^"

ssehoony의 이미지

소켓은 full duplex 입니다.
저도 님께서 말씀하신데로 테스트 해보거나 하지는 않았지만
일단 소켓은 full duplex 이므로 아마 문제가 없다는 것을 의미하는거겠죠.

sharefeel의 이미지

1. 두개의 thread에서 send/recv를 한 소켓에 동시에 수행하였을 경우 문제가 없는지요..
2. select하고 있는 socket에서 다른 thread에서 send/recv를 수행할 경우에 문제가 없는지요..

1번은 send는 문제가 없습니다..
하지만 보통은 여러 스레드가 한 소켓을 동시에 recv하지는 않습니다..
(에러가 날지는 모르겠습니다..)

2에서 다른 스레드에 send/recv 하신다 함은
스레드간의 통신을 소켓으로 하시는 것인지요?
즉 select에서 데이터가 오면..
recv를 수행한후 데이터를 다시 소켓을 통해서 다른 스레드에게 넘긴다.
인 것 같습니다..

스레드간 통신을 위한 소켓도 같이 select에 넣으셔도 무방합니다만..
하지만 필요하신 경우에만 하시면 됩니다.

보통은 프로그램들은.. select 하는 스레드에서 다른 스레드에게 일방적으로 데이터가 넘어가는 구조입니다.
(어디까지나.. 제가 보아온 보통의 프로그램입니다..)
즉 select하는 스레드는 외부로부터 들어오는 데이터만을 읽고,,
여타 스레드는 select스레드로부터의 데이터만을 읽으면 됩니다.
따라서 스레드간 통신을 위한 소켓은 궂이 select 호출에 포함 시킬 필요가 없지요..

만약 다른 스레드에서 select 스레드로 데이터를 보낸다면...
그때는 스레드간 통신을 위한 소켓도 select에 넣으셔야 합니다..

===============
Vas Rel Por

arthor77의 이미지

아더자가용, 고속버스1, 고속버스2

호남고속도로 (소켓)

아더가 호남고속도로로 간다. 이때 고속버스1이 지나간다.

질문 1 : 소켓에서는 충돌이 일어나는가?
질문 2 : 아더와 고속버스1이 호남고속도로로 가기위해서 선택을 할수있을까?
아더는 중부고속도로를 타고 간다.
고속버스1은 경부고속도로를 타고 간다.

댓글 달기

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