socket program 질문입니다.

yangsg의 이미지

socket program중에 질문있습니다..

A - 서버 - B

A(multi)에서 B(multi)로 packet전송시 동일한 fd로 동일한 시간에

전송된다면 어떻게 되는지 궁금해서 질문드립니다..

동일한 시간에 동일한 fd로 전송시에는 lock을 걸어서 처리를 해야 되는지

아니면 socket이 알아서 처리를 하는지.. 알아서 처리를 한다면.. packet이 엉키지 않을련지...

개인적인 생각으로는 lock을 걸어야 할듯한데.. lock을 건다면 그에따른 delay가 문제가 될거 같은데요...

어리버리한 초보에게 고마운 답변 부탁드립니다..

fromdj의 이미지

질문을 잘 이해하지 못하겠는데요
중간에 서버를 경유해서 즉 서버가 패킷을 다시 B로 보내준다는
말인가요,

일단 패킷이 엉키지는 않습니다. 순서는 맞게 들어옵니다. TCP를
쓰신다면요.

^^ be cool ~
http://fromdj.pe.kr

woojhs의 이미지

중계 서버를 사용하시는 것 같은데...

정확하게 질문이 어떤것이지 이해를 못하겠습니다.

그리고 똑같은 fd를 사용하신다고 하는데 한 A or B 에서 같은 fd를 사용하시는 것인지...

일반적으로 위에서 말씀하시데로 tcp를 사용할 경우 packet이 엉키는 경우는 없습니다.

물론 multi를 사용하실때 어떠한 방식을 이용하느냐에 따라서 달라 질수 있다고 봅니다.

그러한 부분은 구현자의 코딩에 따라 다르다고 봅니다.

yangsg의 이미지

우선 중계서버가 있습니다..

A(동일 port를 통한 multi 접속)에서 서버를 통해서

B(동일 port를 통한 multi 접속)으로 중계를 할려고 합니다..

제가 궁금한게 A1과 A2가 같은 시간에 B1으로 send 할 경우 입니다..

A와 B가 서버에 접속할 때는 접속당 하나의 thread를 생성해서 접속당 서로 다른 fd를 가지고 있는 상황입니다..

ssehoony의 이미지

A1 과 A2 가 서버를 거처 B1 으로 쏠때
아무 처리도 안하면 패킷이 엉키는 경우가 생깁니다.

가령 A1과 A2 가 각각 2000 byte 를 송신했다고 하며
서버에 A1의 1500 이 도착하고 그 다음 A2의 1500이 도착하고
그 다음 A1의 500 그 다음 A2의 500 이렇게 도착할 수 있습니다.
아무 드물게 있는게 아니고 A1과 A2가 동시에 쐈다면
이런경우가 아주 빈번히 발생할 듯 하군요.

A1이나 A2에서 송신한 데이터를 서버에서 끝까지 다 받았는지
확인이 가능하다면 lock 을 이용할 필요는 없고 A1에서든 이든 A2
에서든 완전히 받아지면 그때 B1 으로 완전한 데이터만 송신하는
방식으로 하면 될 듯 하군요.

yangsg의 이미지

중계서버가 A1 혹은 A2에서 패킷을 다 전송을 받은후에 B1으로
전송을 합니다..

패킷에 구분자를 사용하여 프그램을 하고 있습니다..
그래서 구분자까지 다 받은 후에 다른 동작을 합니다..

그런데 궁금한건 multi thread 상황이라면 A1, A2 두개의 thread에서
동시에 B1으로 전송하는 경우는 엉키는 경우는 없는지 궁금합니다..

즉, 만약 A1, A2에서 둘다 패킷을 다 받은 경우이고 이것을 B1으로
전송해야 하는 상황이라면 엉키는 일이 없는지 궁금합니다..

참 서버 상황을 말씀 안드린거 같네요..
multi thread로 접속당 새로운 fd를 할당해 주었습니다..

ssehoony의 이미지

write 함수는 쓰레드 안정성 레벨이 Async-Signal-Safe 라고 하는 군요.
이건 비동기로 시그널 핸들러가 호출해도 안정적인 수준이라는 것 같은데
이게 쓰레드에서는 안정적인건지 아닌지 이해하기 어렵네요.
(시그널 핸들러가 비동기로 호출해도 안정적이면 쓰레드에서는 당빠 안전한
것 같기는 한데 ^^)

자세한건 여기를 조사해 보세요.
http://docs.sun.com/app/docs/doc/805-5080/6j4q7emha?a=view

ssehoony의 이미지

그리고 테스트로 두 쓰레드에서 동일한 fd 의 파일에 write 로 기록을 해보세요
한 쓰레드는 0123456789 를 기록하고 다른 쓰레드는 abcdefghijklmnopqrstuvwxyz 을 기록하는 거져
그래서 서로 꼬이는지 확인해 보는 것도 좋은 실험이 될 듯 하네요.

yangsg의 이미지

테스트는 두개의 쓰레드로 동일한 fd로 하나는 0.2초간격으로 또 다른 하나는 0.1초 간격으로
한쪽에서는 0000000000000000 다른 한쪽에서는 11111111111111111
이런씩으로 테스트를 하였습니다...
결과는 꼬이지 않았습니다...
제법 많이 테스트를 해 보았구요...
그래서 나름대로 결론을 내려보면...
멀티 thread를 돈다면... 운영체제가 알아서 스케줄링을 한다입니다..
결론이 맞는지는 모르겠습니다만.. 일단 테스트에서 꼬이지는 않았습니다..

댓글 달기

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