소켓 프로그래밍에서 송수신 대상을 어떻게 명명하나요?

kakalot81의 이미지

소켓 프로그래밍 입문자입니다.

클러스터 환경에서 각 노드간 신호전달이 주 목적입니다.
[M : 마스터 노드 / S1 : 슬레이브 노드1 / S2 : 슬레이브 노드2] 라고 가정했을 때

M에서 S1, S2로 데이터 신호(각각 다른)를 보내면 S1, S2에서 받은 신호를 출력하는 간단한 테스트 프로그램을 짜보려 하고 있는데 송수신 대상을 어떤 방법으로 명명해주어야 할 지 모르겠습니다.
소켓 프로그래밍의 경우 일반적으로(입문예제) 서버는 [./server &] 라는 실행파일을 백그라운드로 실행해 신호를 send하고, 각 클라이언트는 [./client 마스터노드] 라는 명령으로 신호를 recv하는 방법으로 호스트를 판단?하고 있는데요.
이외의(병렬 프로그래밍과 혼용해 코딩하고 있기에 보다 통합적인 방법이 필요합니다.)
소켓 함수중 accept(.., &slave_addr,..)의 두번째 필드는 통신자가 아니더군요..ㅜㅜ;

즉 주 목적인 M에서 각 하위 노드로 다른 데이터 신호를 보내는 경우 어떻게 슬레이브노드의 호스트네임을 판단시켜야 할지 막막합니다.
[./server s1 s2] 이런식으로는 절대 안되겠지요.ㅎㅎ
** mpich(병렬 lib)의 경우, send / recv 함수의 변수필드에 myrank라는 프로세서id(0,1,2...)를 명명해줘서 송수신 대상을 파악할 수 있습니다.

소켓 프로그램 코드 차원에서 각 노드의 호스트네임을 명명 혹은 받아와서 서로 통신할 수는 없을까요?

어떤 방법이 있나요? 조언 부탁드립니다.

kakalot81의 이미지

gethostname() 함수를 쓰면 가능할까요? 사용예가 있으면 참 좋을텐데요.

ymir의 이미지

client 시작시 server 에 패킷을 하나 보내서, registration 과정을 거치면 되지 않을까요..?
프로토콜을 정의하면 간단히 해결할 수 있을 것 같습니다만...?

또 다른 방법이라면... 차라리 multi-casting 을 해서..
해당 그룹에 참여한 자들만 패킷을 받게 하는 수도 있겠네요..

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

kakalot81의 이미지

패킷을 받아 온다는 개념이 정확히 어떤 것인지 잘 모르겠네요.
클라이언트측에 서버 호스트를(소켓 구조체 정보) 등록한다는 뜻일까요?

ymir의 이미지

우선 server 와 client 의 로직을 그려보세요..
그래야 좀 더 자세한 얘기가 될 수 있겠네요..

별도의 프로토콜이 정의되어 있는 것 같지는 않고..
slave 간에 우선 순위가 필요한 경우인지,
주기적인 signal 전송이 필요한 케이스인지 등..

일단 글로만 봤을 때에는...
server 에서는 정해진 프로토콜에 따라, client list 를 관리하고..
해당 list 에 대해 주기적으로 데이터를 보내주면 될 것 같은데 말이죠.. ;;;

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

kakalot81의 이미지

답변 감사드립니다.
프로토콜이라 함은, tcp, udp를 칭하는 건거요? 우선 그 개념이 잘 안서네요.
프로토콜은 결정하는 방법이 뭘까요? SOCK_STREAM 이건 아닐테지요..ㅡㅡ;

참 슬레이브간의 우선순위는 필요없고, 주기적인 시그널은 필요한 경우입니다.

brucewang의 이미지

gethostbyname() 샘플..
http://paulschreiber.com/blog/2005/10/28/simple-gethostbyname-example/

그리고, ymir 님께서도 좋은 아이디어를 말씀해 주셨네요. 제가 좀더 살을 붙이자면,

ymir님이 말씀하신 "하나의 서버에 등록" 하자는것은, 각 sub node들 (s1, s2)은 새로운 중간 서버 (예를들어 'i')에 자기 주소를 알려주는 겁니다. 그리고 마스터도 역시 중간서버 i에 접속하는데, 여기서 그 sub node들의 주소를 다시 받아오는 거죠.

kakalot81 님이 sub node들에게 master의 주소를 알려주신다고 하셨으니, 그냥 직접 sub node들이 기동되면 각자 Master에 접속하거나, 패킷을 날리면 Master는 곧바로 누가 sub node 인지 알수도 있구요.

그리고, multicast도 좋은 방법이고, 만일 그 sub node들이 같은 subnet에 존재한다면 그냥 서버는 0.0.0.0 주소로 패킷을 날려줘도 되겠군요 (broadcast). 그런데 라우터들 중에 multicast를 지원해주지 않는 것들이 있어서 여러 네트워크 영역에 분산된 node들이라면 좀 힘들수도 있으니 ymir님의 첫 방법 (그냥 sub node들이 자신의 주소를 등록하는) 을 쓰시는것이 좋지 않을까 하네요.

-------------------------------------------------
$yes 4 8 15 16 23 42

kakalot81의 이미지

중간서버라 함은 가상적인 서버개념을 말씀하시는건지..
이런 중간 서버의 등록 및 사용은 어떻게 하는건지요.

흑.. 관련 서적을 사서 읽어봐야 겠네요. 질문하기전에 개념을 먼저 잡아야 할 듯 합니다.
답변 감사드립니다. ^^

댓글 달기

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