멀티 스레드에서 하나의 세션(connected socket)을 이용하는 전송을 시작하는 주체에 따른 문제점 발생
안녕하세요?
TCP/IP에 관련된 질문을 드립니다.
일단 구현의 용이성 때문에 동기식으로 구현을 했구요...ㅠ.ㅠ
Client ========HEARTBEAT=====> Sever (Application heartbeat (주기적)) ==> 스레드 1개
<========HEARTBEAT_ACK=====
--------------------------------------------------------------------------------------------------------------
Client <======MSG============== Server (특정 메시지 (비 주기적)) ===> 스레드 1개
=========MSG_ACK======> Client (특정 메시지 ACK)
--------------------------------------------------------------------------------------------------------------
이런식의 스레드가 존재하게 되는데....이때 스레드는 동일한 소켓을 사용하게 됩니다. [동일 세션 사용]
스레드간의 Lock 처리를 통해서 손쉽게 될 줄 알았는데....
lock 처리를 한다고 하더라도.. 문제가 생기네요..ㅠ,ㅠ. 일단 다른쪽에서 수신대기를 함으로 인해서... 본래 스레드가 수신을 해야할
메시지를 처리하고 있는데...ㅠ,ㅠ. 쩝.. 해결할 수 있는 손쉬운 방법이 없을까요?
메시지 전송측을 한쪽으로 몰아 버리게 된다면... lock으로 처리로 될 수 있을 것 같아 보입니다.
아래와 같은 방법 말고 아래와 같은 방법 말고 다른 방안이 없을까요?
locking
<======heartbeat===========
=========ACK=======>
unlocking
locking
<========특정 메시지======
==========메시지 ACK ====>
unlocking
TCP/IP 소켓은 아예 잼병이라서 어렵네요..
읽어주셔서 감사합니다.
상대적으로 처리하시면 어떨가요
간단하게 그냥
서버와 클라이언트에 모두 비동기적으로 처리하시면 될 듯 한데..
프로토콜 하나 만드시고 프로토콜중 HEARTBEAT역할의 프로토콜을 만드신 후
세션객체의 멤버를 하나 만드시는데 이 멤버가 최종 HEARTBEAT타임입니다. 이 타임을 다른 스레드에서 주기적으로 체크하도록 하고ㅓ
일정 시간이 지나면 디스커넥트 처리하게 되는 거지용
댓글 달기