안녕하세요 W5500 칩을 저희 보드에 적용하여 서버와 클라이언트 기능으로 잘 사용하고 있었습니다.
최근에 고객으로부터 통신이 되지 않는다는 이야기를 듣고 확인해 보니 TCP 클라이언트 기능이 잘 되지 않았습니다.
- 채널별 사용 상황
- 채널 0번 : TCP 서버
- 채널 1번 : TCP 클라이언트
- 채널 2번 : TCP 클라이언트
현상은 다음과 같습니다.
- Socket.c 의 connect 함수내 while(getSn_SR(sn) != SOCK_ESTABLISHED) 를 빠져나오지 못하고 있었습니다. (타임아웃 또는 무한루프)
- 저희 회사나 (광랜 <=> 공유기 <=> 스위치 <=> 장비) 저희 회사와 비슷한 현장에서는 클라이언트 기능이 잘 동작 합니다.
- 다만, 저희와 어떻게 다른지 모르겠지만 규모가 큰 네트워크가 붙은 회사 네트워크에서는 클라이언트로써 서버 connection 이 되지 않습니다.
- 재밌는건 TCP 클라이언트가 되지 않는 현장에서 다른 채널로 다른 서버로는 TCP 클라이언트 동작은 잘 되고 있습니다…
상황을 정리하면 다음과 같습니다.
- 네트워크 구조가 간단한 곳에서는 TCP 클라이언트로 동작을 잘 합니다. (클라이언트 2채널 모두 2년간 패킷 한번 빠지지 않았습니다.)
- 네트워크 구조가 복잡한 곳에서는 서버로 부터 커넥션 accept 를 받지 못 합니다.(채널 1, 다른서버와 인터페이스한 채널 2번은 동작을 잘 합니다.)
- 안 되는 현장에서 다른 제품은 TCP 클라이언트 동작을 잘 합니다. (결국 네트워크와 서버에는 문제가 없는것으로 보입니다.)
상황이 단순하면서도 이상해서 어디서부터 디버깅을 해야할지를 모르겠습니다.
- 질문
- 소스에서 네트워크 규모별로 옵션을 줘야하는 부분이 혹시 있습니까?
- 8 개 채널 중 0번은 서버, 1번과 2번은 TCP 클라이언트로 사용합니다. 계속 이렇게 사용해 왔는데 혹시 이렇게 사용하면 안되나요?
- 0번 서버 소켓이 Listen 상태가 되기 전에 1번과 2번을 이용해서 통신을 시작하는데 이렇게 사용하면 안되나요? (통신하는 서버 주소가 3 채널 모두 틀린데, 무조건 서버 소켓이 listen 상태가 된 후 다른 2개의 채널을 사용해야 하나요?)
- 서버의 환경이 틀립니다.
- 채널 1번 (통신이 잘 안되는 것) : 서버가 로그 발랜싱이 되어 있습니다. (소켓별 30분간 소켓 close가 없으면 30분간 소켓을 유지 후 통신이 없으면 자동으로 끊습니다.)
- 채널 2번 (채널 1번이 통신이 안 되는 네트워크에서도 통신이 잘 되는 것) : 보통 서버 입니다.
혹시 위의 조건 때문에 저희 장비에 영향이 있을 수도 있습니까? (이전 질문 사항 중에 클라이언트 포트를 계속 바꿔줘야 한다는 글을 읽어서요.)
바쁘시겠지만 우문 현답 부탁 드립니다.