---
title: "W6100 DHCP로 TCP/IP 연결 관련 질문"
url: "https://maker.wiznet.io/forum/13554"
markdown_url: "https://maker.wiznet.io/forum/13554/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "Member 11128"
created: "2019-10-28T02:27:09+09:00"
last_activity: "2019-10-28T04:46:47+09:00"
language: "ko"
views: 814
replies: 5
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

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

## Question

Asked by Member 11128 on 2019-10-28 in Ethernet Chips.

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

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

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

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

## Replies

### Reply 1 by becky, 2019-10-28

TCP도 됩니다.

### Reply 2 by Member 11128, 2019-10-28 (in reply to reply 1)

답변감사합니다.

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;
  }
```

}

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

### Reply 3 by becky, 2019-10-28

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)
{
    ;
}
```

### Reply 4 by becky, 2019-10-28

[main.zip](https://maker.wiznet.io/forum/legacyFile.asp?path=z5HLzbyQa2R2yAFt2lwGbBQBhrU.zip) (4.3 KB)
제가 테스트시 사용한 main.c 파일 첨부해드립니다.

### Reply 5 by Member 11128, 2019-10-28

답변 감사합니다.

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

답변 많은 도움 됩니다.

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

---

Source: https://maker.wiznet.io/forum/13554
