WIZnet Developer Forum

W6100 DHCP로 TCP/IP 연결 관련 질문

W6100을 이용하여 DHCP를 구현 할려고 합니다.

우선 UDP 연결은 어느정도 된거 같은데

TCP로 연결을 할려고 하니 안되네요.

혹시 DHCP는 UDP만 되는건가요?

TCP도 됩니다.

답변감사합니다.

io6library에 있는 DHCPv4.c 를 사용하여 DHCP 설정을 진행하고 있습니다.

우선 UDP의 경우는 연결에 성공을 하였습니다.

TCP로 통신을 하고 싶어 아래 코드와 같이 수정을 하였습니다.
-------------------------------------------------------원본----------------------------------------------------------
dhcpv4.c - DHCPv4_run(void)

-socket(DHCPV4_SOCKET, Sn_MR_UDP, DHCPV4_CLIENT_PORT, 0x00);

-------------------------------------------------------수정----------------------------------------------------------
dhcpv4.c - DHCPv4_run(void)

-socket(DHCPV4_SOCKET, Sn_MR_TCP, DHCPV4_CLIENT_PORT, 0x00);

Sn_MR_UDP -> Sn_MR_TCP 로 수정을 한 후에 테스트를 해보니

Sokcet.c - sendto() 함수안의 아래 부분에서 무한루프를 타네요.

while(1)
{

  tmp = getSn_IR(sn);
  
  if(tmp & Sn_IR_SENDOK)
  {
   
     setSn_IRCLR(sn, Sn_IR_SENDOK);
     break;
  }  
  else if(tmp & Sn_IR_TIMEOUT)
  {
    
     setSn_IRCLR(sn, Sn_IR_TIMEOUT);   
     return SOCKERR_TIMEOUT;
  }

}

혹시 어떤게 잘못되었을까요?

DHCP는 IP를 할당받기 위한수단입니다.
TCP통신을 하기 위해서는 DHCP로 IP를 할당 받은 이후, TCP 소켓을 열어 TCP 통신을하시면 됩니다.
dhcpv4.c에서 UDP 로 소켓을 오픈한이유는 DHCP가 UDP 기반의 프로토콜이기 때문입니다.
아래코드대로 작성하신후 DHCP Success이후 TCP Socket을 open하여 통신하시면 됩니다.

DHCPv4_init(0, test_buf);
reg_dhcpv4_cbfunc(dhcpv4_assign, dhcpv4_update, dhcpv4_conflict);
if (gWIZNETINFO.ipmode == NETINFO_DHCP_V4) {       // CHEP DHCP
	printf("Start DHCP\r\n");
	while (1) {
		ret = DHCPv4_run();

		if (ret == DHCP_IPV4_LEASED) {
			printf("DHCP Success\r\n");
			break;
		}
		 else if (ret == DHCPV4_FAILED) {
			 dhcp_retry++;
		}

		if (dhcp_retry > 3) {
			printf("DHCP Fail\r\n");
			break;
		}
	}
}
ctlnetwork(CN_SET_NETINFO, (void*) &gWIZNETINFO);

callback 함수는 아래와같습니다.

void dhcpv4_assign(void)
{
    getIPfromDHCPv4(gWIZNETINFO.ip);
    getGWfromDHCPv4(gWIZNETINFO.gw);
    getSNfromDHCPv4(gWIZNETINFO.sn);
    getDNSfromDHCPv4(gWIZNETINFO.dns);

    ctlnetwork(CN_SET_NETINFO, (void*) &gWIZNETINFO);
}

void dhcpv4_update(void)
{
    ;
}


void dhcpv4_conflict(void)
{
    ;
}

main.zip (4.3 KB)
제가 테스트시 사용한 main.c 파일 첨부해드립니다.

답변 감사합니다.

제품 양산 개발을 위해 W6100을 사용하고 있는데 처음 Ethernet 프로젝트라서 모르는 점이 많이 있네요.

답변 많은 도움 됩니다.

한번 주신 파일로 테스트 진행 해보겠습니다.

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