네트웍 프로그래밍에서, 이게 가능한지 궁금합니다.
글쓴이: bsakiag / 작성시간: 목, 2010/10/21 - 9:38오전
두개의 프로세스가 있습니다. (둘중하나는 드레드입니다.)
1번 프로세스에서는 message Queue를 msgrcv()해서 TCP/IP로 send를 합니다.
2번 프로세스(스레드)에서는 상대로 부터오는 message와 1번 프로세스가 보낸 msg의 ACK 메시지를 수신합니다.
문제는, 1번에서 보낸 메시지의 ACK가 와야 다음메시지를 전송해야 하는 구조입니다.
그런데, 보내는 프로세스와 받는 프로세스(또는 스레드)가 다르다 보니.. 좀 복잡해 지는거 같아서요..
간단하게 해결 할 수 있는 방법은 없을까요?
1번에서 send하고 바로 recv()를 할 수 있으면 좋은데, 그렇게 되면 2번에서 recv() 하고 있는 것과 동시에 2개의 recv() 하는 꼴이 되어서 어디로 ACK가 올지 모르는 상황이 되버릴거 같아서, 해결책은 아닌거 같습니다.
현재는 1번에서 send하고 pthread 조건 변수를 wait_timed()를 합니다. 2번에서 ACK가 오면 signal_condition을 하고요..
더 심플한 구조가 있을거 같은데.. 조언 바랍니다.
Forums:
지금도 충분히 심플하다고 생각됩니다만 ㅠㅠ
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
application을 message
application을 message queue에서 message를 받는 thread#A와, TCP로 send/receive하는 thread#B로 나눠서 작업하면 될 것 같군요.
thread#A는 message를 받아서 내부 list? 등으로 보관하고 있고, thread#B에서 이를 하나씩 꺼내어(동기화한 후) 작업하면 될 것 같네요.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
왜
왜 process(or thread)를 나누어놨는지 모르겠군요.
그냥, 보내고 받고를
하나에서 처리하시는게 flow control 하시는 데에 편하지 않나요?
저렇게 하시면 2번 process가 1번 process한테 또 알려줘야 하고,
어짜피 1번 process에는 수신부(?)가 있어야 합니다.
답변주신 모든 분들께 감사드립니다.
많은 도움 되었습니다.
madman93 님// 감사합니다. 용기를 얻었습니다. ^_^
cinsk님 // 모양새(?)는 cinsk님이 언급하신 방법이 더 나아보입니다. 다음엔 꼭 참고하겠습니다.
drinkme님// 사족을 달자면, 하나로 처리할 경우, 상대편에서 Ack가 정상적으로 제때 제때 안오게 되면..
message Q에 계속 적체가 되고.. 여기까진 좋은데, Q full 이 발생되기 때문입니다.
message Q의 id와 socket fd의 멀티플렉싱만 된다면.. (select or poll)
정말 속이 후련할거 같은데.. 그게 안된다네요..
SysV msg*()를 쓰지 말고
SysV msg*()를 쓰지 말고 local domain socket을 써서 message queue를 만드세요. 그러면 select/poll을 쓸 수 있습니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기