astroshim / thunder-chat

0 stars 0 forks source link

ChatServer socket break. #3

Open astroshim opened 5 years ago

astroshim commented 5 years ago

1

20180903 060231 : In EPOLLERR or EPOLLHUP disconnect (0x9a80d0) (7) errno=(2)(No such file or directory)
20180903 060231 : ChatManager::CloseClient ==> (0x9a80d0)(7)

2

20180903 060323 : ClientBuffer OverFlow! (8),messageLengthInSocket=(1185),GetFreeSize()=(1024)
20180903 060323 : Close In ThreadWorker.(0x9a85a0)
20180903 060323 : ChatManager::CloseClient ==> (0x9a85a0)(8)
astroshim commented 5 years ago

ChatManager log

20180903 160737 : In Client::IsValidPacket BufferedPacketBytes=0
20180903 160737 : In ThreadWorker.(0x1c89cc0), packetLen=(0)
20180903 160737 : In EPOLLERR or EPOLLHUP disconnect (0x1c89c00) (7) errno=(17)(File exists)
20180903 160737 : ChatManager::CloseClient ==> (0x1c89c00)(7)
20180903 160737 : EPOLLIN Client 0x1c89cc0, events=(1)
20180903 160739 : CircularBuff::Get getPacketSize=(15) BufferUseBytes=(15) Head(951),Tail(966), buff=(0x1c9de40)
20180903 160739 : In Client::GetPacket 읽은 packet size = 15
20180903 160739 : ClientChatServer::ExecuteCommand(0x1c89cc0) command=(1620)
20180903 160739 : ClientChatServer::MessageBroadcast Broadcast 요청 받음 from uniqId=(1535999445), length=(11), message=(hi)
20180903 160739 : In Client::IsValidPacket BufferedPacketBytes=0
20180903 160739 : In ThreadWorker.(0x1c89cc0), packetLen=(0)
20180903 160739 : In EPOLLERR or EPOLLHUP disconnect (0x1c89cc0) (8) errno=(17)(File exists)
20180903 160739 : ChatManager::CloseClient ==> (0x1c89cc0)(8)

ChatServer log

20180903 160739 : In CircularBuff::Put(0x7ff4b9f828b0) messageLengthInSocket=(3), m_iUseBufferSize=(0), m_iHead=(0), m_iTail=(0)
20180903 160739 : ThreadBroadcaster message : (hi)
20180903 160739 : In ThreadReceiver [0x1c89c10]thread Client (0x7ff4b9f753d0) fd=(2635), iPacketLen=(0)
20180903 160739 : In ThreadReceiver [0x1c89c10]thread Client got! (0x1c9c0d0) fd=(8)
20180903 160739 : ClientBuffer OverFlow! (8),messageLengthInSocket=(2370),GetFreeSize()=(467)
20180903 160739 : Close In ThreadReceiver.(0x1c9c0d0)
20180903 160739 : ChatServer::CloseClient(0x1c9c0d0) 1
20180903 160739 : ThreadBroadcaster message : (hi)
20180903 160739 : ChatServer:: 메세지를 manager로 relay from uniqId=1535999445, size=(11), message=(hi)
20180903 160739 : ChatServer:: 메세지를 manager로 relay from uniqId=1535999445, size=(11), message=(hi)

=> 중간에 ClientBuffer OverFlow 로 socket을 종료 하게 되는데, 그 이유는 로 manager 에서 들어오는 packet 이 한꺼번에 몰려서 발생하는 현상으로 보인다.

astroshim commented 5 years ago

해결 방안으로 일단은 CircularBuffer size를 늘이는것이다.

astroshim commented 5 years ago

oneshot 옵션을 제거 했을때, socket 이 비정상 종료 되는 현상이 있다.

manager

20180904 151026 : In Client::GetPacket 읽은 packet size = 107
20180904 151026 : ClientChatServer::ExecuteCommand(0x1b0ccc0) command=(1620)
20180904 151026 : ClientChatServer::MessageBroadcast Broadcast 요청 받음 from uniqId=(1536093004), length=(103)
20180904 151026 : message broadcasting from manager to (1536093003), fd=(7)
### client 소켓이 끊어진 상태인데, 쓸려고 하니 에러가 발생함. : 즉 client에서 연결이 종료되었다는 이야기.
20180904 151026 : I got the Signal (13)
20180904 151026 : Error Write errno=(32)(Broken pipe), fd=(7)
20180904 151026 : In Client::IsValidPacket buffer=(0x1b20e40), BufferedPacketBytes=0
20180904 151026 : In ThreadWorker.(0x1b0ccc0), packetLen=(0)
20180904 151026 : In ThreadWorker [0x1b0ca20]thread Client got! (0x1b0cc00) fd=(7)
20180904 151026 : ClientBuffer USER_CLOSE!(0x1b1ee30) fd=(7), messageLengthInSocket=(0), BufferFreeSize=(8192), BufferedPacketSize=(0)
20180904 151026 : InClient::FillFromSocket(0x1b0cc00) fd=(7), USER_CLOSE, len=(0)
20180904 151026 : InClient::FillFromSocket(0x1b0cc00) capacity=[8192], fd=(7), filled=> 0
20180904 151026 : In EPOLLERR or EPOLLHUP disconnect (0x1b0cc00) fd=(7) errno=(2)(No such file or directory)
20180904 151026 : ChatManager::CloseClient ==> (0x1b0cc00), fd=(7)

chatserver

20180904 151026 : In ThreadReceiver.(0x1b1f0d0), fd=(8), packetLen=(214)
20180904 151026 : Broadcast 요청 (manager를 통해 전달해온 메세지) == client 에 broadcasting 만 하면 되는 메세지.
20180904 151026 : CircularBuff::Get getPacketSize=(107) BufferUseBytes=(214) Head(4455),Tail(4669), buff=(0x1b20170)
20180904 151026 : In Client::GetPacket 읽은 packet size = 107
20180904 151026 : MESSAGE, packet_length=(103), messageSize=(95)(hiasodijfosadjflaskfjlkjsdlafkjlkjsadlkfjasldkfjlskdjlaskjdflsakjdflkasjdflksajdflksajdflksajf)
20180904 151026 : In ChatUser:: message fd=(8), buffedSize=(95)
20180904 151026 : In Client::IsValidPacket buffer=(0x1b20170), BufferedPacketBytes=107
20180904 151026 : In ThreadReceiver.(0x1b1f0d0), fd=(8), packetLen=(107)
20180904 151026 : Broadcast 요청 (manager를 통해 전달해온 메세지) == client 에 broadcasting 만 하면 되는 메세지.
20180904 151026 : CircularBuff::Get getPacketSize=(107) BufferUseBytes=(107) Head(4562),Tail(4669), buff=(0x1b20170)
20180904 151026 : In Client::GetPacket 읽은 packet size = 107
20180904 151026 : MESSAGE, packet_length=(103), messageSize=(95)(hiasodijfosadjflaskfjlkjsdlafkjlkjsadlkfjasldkfjlskdjlaskjdflsakjdflkasjdflksajdflksajdflksajf)
20180904 151026 : In ChatUser:: message fd=(8), buffedSize=(95)
20180904 151026 : In Client::IsValidPacket buffer=(0x1b20170), BufferedPacketBytes=0
### socket buffer 에 data가 없어서 종료시킴.
20180904 151026 : In ThreadReceiver [0x1b0cc10]thread Client (0x1b1f0d0) fd=(8), iPacketLen=(0)
20180904 151026 : In ThreadReceiver [0x1b0cdb0]thread Client got! (0x1b1f0d0) fd=(8)
20180904 151026 : ClientBuffer USER_CLOSE!(0x1b20170) fd=(8), messageLengthInSocket=(0), BufferFreeSize=(8192), BufferedPacketSize=(0)
20180904 151026 : InClient::FillFromSocket(0x1b1f0d0) fd=(8), USER_CLOSE, len=(0)
20180904 151026 : InClient::FillFromSocket(0x1b1f0d0) capacity=[8192], fd=(8), filled=> 0
20180904 151026 : NewClient(0x7f485c6cb820) ClientSocket=(0x7f485c6cb7e0), fd=(576), type=(1)
20180904 151026 : EPOLLIN Client 0x7f485c6cb820, fd=(576), events=(1)

"socket is broken" 으로 검색하면됨.

astroshim commented 5 years ago

data를 보내고, 응답을 받고 하는 구조가 아니라, 지금과 같이 같은 소켓에 데이터가 계속 들어오는 경우를 처리 하려면, 현재 프로그램 구조가 맞지 않다.