[W5500] TCP Client Connect 에러

안녕하세요 W5500 칩을 저희 보드에 적용하여 서버와 클라이언트 기능으로 잘 사용하고 있었습니다.
최근에 고객으로부터 통신이 되지 않는다는 이야기를 듣고 확인해 보니 TCP 클라이언트 기능이 잘 되지 않았습니다.

  • 채널별 사용 상황
  • 채널 0번 : TCP 서버
  • 채널 1번 : TCP 클라이언트
  • 채널 2번 : TCP 클라이언트

현상은 다음과 같습니다.

  1. Socket.c 의 connect 함수내 while(getSn_SR(sn) != SOCK_ESTABLISHED) 를 빠져나오지 못하고 있었습니다. (타임아웃 또는 무한루프)
  2. 저희 회사나 (광랜 <=> 공유기 <=> 스위치 <=> 장비) 저희 회사와 비슷한 현장에서는 클라이언트 기능이 잘 동작 합니다.
  3. 다만, 저희와 어떻게 다른지 모르겠지만 규모가 큰 네트워크가 붙은 회사 네트워크에서는 클라이언트로써 서버 connection 이 되지 않습니다.
  4. 재밌는건 TCP 클라이언트가 되지 않는 현장에서 다른 채널로 다른 서버로는 TCP 클라이언트 동작은 잘 되고 있습니다…

상황을 정리하면 다음과 같습니다.

  1. 네트워크 구조가 간단한 곳에서는 TCP 클라이언트로 동작을 잘 합니다. (클라이언트 2채널 모두 2년간 패킷 한번 빠지지 않았습니다.)
  2. 네트워크 구조가 복잡한 곳에서는 서버로 부터 커넥션 accept 를 받지 못 합니다.(채널 1, 다른서버와 인터페이스한 채널 2번은 동작을 잘 합니다.)
  3. 안 되는 현장에서 다른 제품은 TCP 클라이언트 동작을 잘 합니다. (결국 네트워크와 서버에는 문제가 없는것으로 보입니다.)

상황이 단순하면서도 이상해서 어디서부터 디버깅을 해야할지를 모르겠습니다.

  • 질문
  1. 소스에서 네트워크 규모별로 옵션을 줘야하는 부분이 혹시 있습니까?
  2. 8 개 채널 중 0번은 서버, 1번과 2번은 TCP 클라이언트로 사용합니다. 계속 이렇게 사용해 왔는데 혹시 이렇게 사용하면 안되나요?
  3. 0번 서버 소켓이 Listen 상태가 되기 전에 1번과 2번을 이용해서 통신을 시작하는데 이렇게 사용하면 안되나요? (통신하는 서버 주소가 3 채널 모두 틀린데, 무조건 서버 소켓이 listen 상태가 된 후 다른 2개의 채널을 사용해야 하나요?)
  4. 서버의 환경이 틀립니다.
  • 채널 1번 (통신이 잘 안되는 것) : 서버가 로그 발랜싱이 되어 있습니다. (소켓별 30분간 소켓 close가 없으면 30분간 소켓을 유지 후 통신이 없으면 자동으로 끊습니다.)
  • 채널 2번 (채널 1번이 통신이 안 되는 네트워크에서도 통신이 잘 되는 것) : 보통 서버 입니다.
    혹시 위의 조건 때문에 저희 장비에 영향이 있을 수도 있습니까? (이전 질문 사항 중에 클라이언트 포트를 계속 바꿔줘야 한다는 글을 읽어서요.)

바쁘시겠지만 우문 현답 부탁 드립니다.

안녕하세요

먼저 해당 질문에 대한 답변을 드리겠습니다.

  1. 소스에서 네트워크 규모별로 옵션을 줘야하는 부분이 혹시 있습니까?
    → 네트워크 규모별 옵션을 주는 부분은 없습니다. W5500과 연결할 장비의 정보(Mac, address, port number)만 있으면 됩니다.
  2. 8 개 채널 중 0번은 서버, 1번과 2번은 TCP 클라이언트로 사용합니다. 계속 이렇게 사용해 왔는데 혹시 이렇게 사용하면 안되나요?
    → 문제가 없습니다. 0번의 서버가 1번,2번 TCP 클라이언트와 통신하지 않는이상 사용하셔도 됩니다.
  3. 0번 서버 소켓이 Listen 상태가 되기 전에 1번과 2번을 이용해서 통신을 시작하는데 이렇게 사용하면 안되나요? (통신하는 서버 주소가 3 채널 모두 틀린데, 무조건 서버 소켓이 listen 상태가 된 후 다른 2개의 채널을 사용해야 하나요?)
    → 모든 채널은 별개도 돌기때문에, 0번이 Listen이 되지 않는다고 해서 1,2번에 영향을 미치지 않습니다.

WIZnet칩은 네트워크가 간단하든, 복잡하든 상관없습니다.
그리고 W5500 는 TCP로 연결될 장비의 MAC, Address, Port만 있으면 통신가능합니다.
단, Client로 동작을 할경우에는 연결이 종료되고 다시 접속을 할경우 W5500의 local port를 변경해주셔야합니다.
그렇지 않으면, Server가 접속했던 Port정보를 가지고 있기 때문에 접속을 못하도록 합니다.
저희가 제공해드리는 Loopback 코드에서Client로 동작할경우, 채널을 열때마다, Local port number를 증가하도록 코드를 구성해놨습니다.
image
위와 같이 코드가 구성되어있는지 확인 부탁드립니다.

감사합니다.
irina

빠르고 명확한 답변에 감사 드립니다.
말씀해 주신데로 Port 번호 변경해서 해결하였습니다.

다시 한 번 깊이 감사 드립니다.
수고 하십시요.

해결되었다니, 다행입니다.
또다른 질문이 있으실때는 언제든 질문주세요~

감사합니다.
irina