WIZnet Developer Forum

W5100 루프백 테스트시 무한 send현상

안녕하세요
W5100을 사용하여 제품개발중 문의점이 발생하여 질문드립니다.

기본 폼은 w5100 driver를 적용[data type 변형(UCHAR -> unsigned char) 및 함수name만 변경사용중]하여 사용하고 있는데 실제 socket open 및 connect하는 함수의 일부분 첨부 드립니다.
.
.
.
switch(W5100_Sn_state_get(0))
{
case SOCKET_STATE_sock_closed: // socket_open
if( !(socket_open(0, SOCKET_MODE_tcp,MASTER_SYSTEM_SETTING_master_comm_port_num, 0x20)) )
{

        }
        else
        {
            connect(0, socket[0].destination_IP_add, MASTER_SYSTEM_SETTING_master_comm_port_num); 
            //litsen(0);
        }
    break;
        
    case SOCKET_STATE_sock_established:     // connect

#ifdef DEBUG_MODE
sprintf(uart3.tx_data,“length get recieved size [%d]byte\r\n”, W5100_Sn_rx_data_size_get(0));
uart3.tx_len = strlen(uart3.tx_data);
uart_tx_start(uart3.tx_data,uart3.tx_len);
#endif
if( (len = W5100_Sn_rx_data_size_get(0)) > 0)
{
if(len > 1024) len = 1024;
len = recv(0,spi.rx_data, len);
#ifdef DEBUG_MODE
sprintf(uart3.tx_data,“recieved size [%d]byte\r\n”, len);
uart3.tx_len = strlen(uart3.tx_data);
uart_tx_start(uart3.tx_data,uart3.tx_len);
#endif
send(0, spi.rx_data,len);
.
.
.

위와 같이 현재 socket상태를 확인하여 닫혀 있는경우 해당 socket을 open후 PC[하이퍼터미널]로 connect요청을 합니다.
그런데 해당 socket을 connect할 경우 [client Mode] established 단계에서 PC쪽에서 임의의 data를 전송하면 해당 data를 연속해서 계속 send하고
해당 socket을 litsen할 경우 [server mode] established 단계에서 PC쪽에서 임의의 data를 전송하면 해당 data를 원하는대로 loopback합니다.

connect 및 listen 시 연결시작요청하는 주체만 다를뿐 양쪽에서 socket이 open되면 이후 처리되는 routine은 동일한것 아닌가요?

wireshark 캡쳐 화면 첨부드립니다.


말씀하신 것처럼 접속 주체의 차이이지 데이타통신과 무관합니다.

다시한번 코드 상에 잘못한 부분이 없는지 살펴보시고,
문제 발생시 정상적인 것과 비정상적인 부분을 캡쳐하셔서 이미지 파일 말고 wireshark 캡쳐 파일과 아이피 정보등을 알려주세요.

우선 답변 감사합니다.

code상에서는 established 부터의 code는 모두 같은 routine을 사용하고 있습니다.

connect일때와 listen일때의 capture file 첨부해 드리오니 확인부탁드립니다.

또한 target 정보는 192.168.0.50이며 PC정보는 192.168.0.30입니다.
바탕 화면.zip (40.5 KB)

패킷 분석 결과 문제는 없어 보입니다. 모두 정상 송수신을 하고 있는 것으로 판단됩니다.

말씀하신 이부분이 문제가 되는 것인가요? Data를 전송하는 것은 패킷분석상 문제가 없어보입니다.

단지 client mode로 Data 전송이 아닌, 지속적인 접속 시도가 문제라면 , 이는 client mode 로 서버포트로 접속할 때 포트 넘버를 이전에 사용한 값을 지속적으로 사용하기 때문에 발생한 문제로 보입니다.
Client로 사용시 client의 포트넘버는 매번 다른 값을 사용하셔야 합니다.
이와 관련된 내용은 Forum내에서 검색하시면 답변들을 보실수 있을 겁니다.

server모드 일경우에는 PC-> Target B/D 로 1byte전송 시 1byte만 전송되는데
cilent모드 일 경우에는 PC-> Target B/D 로 1btye전송 시 같은문자로 이루어진 1byte문자가 게속해서 전송하네요.

[malformed packet]이란 에러와 함께말이죠.

cennect시 파일의 959번째 packet부터 입니다.

앞서 말씀드린것 처럼 데이타 전송은 모두 정상적인 패킷입니다.

서버가 데이타 1바이트를 전송할 때 클라이언트(W5100)이 데이타를 계속 전송한다고 하시는데,
패킷을 보면 서바가 1바이트씩 줄때 마다 클라이언트가 1바이트씩 전송하는 걸로 보입니다.
서버 처리가 어떻게 되는지 알 수 없지만, W5100의 데이타 전송은 패킷 분석상 극히 정상적으로 보입니다.

서버측 코드를 한번 더 확인 하시고, 실제로 데이타를 전송하지 않는지 확인바랍니다.

ps> [malformed packet]으로 표시되는 것은 tcp로 분석된 것이 아니기 때문에 그렇습니다.

다시 정리하면
client => W5100
sever => Windows xp에서 제공하는 기본 하이퍼터미널프로그램

연결상태까지는 정상적으로 동작합니다.

그러나 loopback test시[PC->W5100->PC]( 받은데이터 그대로 다시 전달) 하는 과정에서
하이퍼터미널프로그램상에 1byte만 전송해도 w5100에서 받은 1byte를 계속 다시 보내는것 같습니다.

새로 capture한 파일 첨부드립니다.
packet상의 1455번째 패킷부터 시작이며,
PC<->W5100과의 packet filter는 "filter"버튼으로 sort 시켜서 보시면 될것같습니다.

감사합니다.
connect시2.zip (58.3 KB)

다시 보내주신 파일 역시 모두 정상입니다.

해당 패킷을 사용자의 command에 의해 전송되는 것입니다.

그럼 왜 자꾸 같은 파일을 전송하는지 살펴 볼 필요가 있습니다.

우선 Loopback 에서

if( (len = W5100_Sn_rx_data_size_get(0)) > 0) 
 {
 if(len > 1024) len = 1024;
 len = recv(0,spi.rx_data, len);
#ifdef DEBUG_MODE 
 sprintf(uart3.tx_data,"recieved size [%d]byte\r\n", len);
 uart3.tx_len = strlen(uart3.tx_data);
 uart_tx_start(uart3.tx_data,uart3.tx_len);
#endif 
 send(0, spi.rx_data,len);

W5100_Sn_rx_data_size_get(0) 의 값이 계속해서 1값을 리턴하는 경우를 생각해 볼 수 있는데,
이런 경우라면 , recv() 함수 수행시 Sn_RX_RD 값을 Update 하지 않아 생기는 문제일 가능성이 높습니다.

한가지 Server Mode에서는 동일한 Function이 제대로 동작한다고 하셨기에, 이럴 가능성은 없다고 생각이 들지만,
한번더 recv 함수가 제대로 구현이 되었는지 확인 부탁드립니다.
또한 send() 호출 없이 계속 data가 나가는 것이라면 send() 함수 이후 더 이상 수행되지 않도록 while(1); 로 block하셔서 테스트 해보세요.

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