WIZnet Developer Forum

TCP socket connect - return값에 대한 문의

arm cortex M4 MCU와 w5500을 사용 중입니다.

TCP client 으로만 동작하며, 개략적으로 아래 4가지 동작의 반복입니다.

  1. socket(sn, Sn_MR_TCP, usPort, 0);
  2. connect(sn, Domain_IP, usPort);
  3. send(sn, (_u8 )&wholemsg[E_BUF_SIZEi], E_BUF_SIZE);
  4. recv(sn, (_u8 *)recvBuf, sizeof(recvBuf));

이렇게 통신 중에 가끔 2번 connect 함수 호출 때 SOCK_OK가 아닌 값이 리턴 될 때가 있는데, 다음의 3종류입니다.

#define SOCKERR_SOCKMODE (SOCK_ERROR - 5) ///< Invalid socket mode for socket operation.
#define SOCKERR_PORTZERO (SOCK_ERROR - 11) ///< Port number is zero
#define SOCKERR_TIMEOUT (SOCK_ERROR - 13) ///< Timeout occurred

이 중에서 SOCKERR_TIMEOUT을 제외하고 SOCKERR_SOCKMODE, SOCKERR_PORTZERO가 리턴되는 상황이 잘 이해가 안됩니다.

첫째, 1번 항목의 socket 생성 시에 protocol(setSn_MR)이나 port(setSn_PORT) 설정이 안된 경우
-> socket 함수에서 에러를 리턴했어야 하는게 아닌지?

둘째, 1번 항목의 socket 생성 시에 protocol(setSn_MR)이나 port(setSn_PORT) 설정은 정상적이었으나 2번 항목으로 넘어오면서 변경된 경우
-> protocol과 port는 레지스터에 쓰여지는 값인데, 변경될 수 있는 요인이 어떤 것인지?

혹은 위에 2가지 경우 외에 SOCKERR_SOCKMODE, SOCKERR_PORTZERO가 리턴될 수 있는 상황이 어떤 것인지 궁금합니다.

안녕하세요.

먼저 SOCKERR_SOCKMODE 발생 이유는 connect 함수는 TCP 모드일 때만 실행 되어야 하는데 해당socket이 TCP mode가 아닌UDP로 open 되었거나 IPRAW 또는 MACRAW로 open 되었을 경우 이 에러가 발생합니다.

두번째 SOCKERR_PORTZERO발생 이유는 destination port를 parameter로 입력하여 connect함수를 호출하는데 이 port번호가 0일경우 발생합니다. 자신의 port번호가 아니라 server의 port번호입니다.

감사합니다.

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.