TCP Server/Client Mode 문의


#1

안녕하십니까

저번에 TCP Ping 관련 하여 질문을 드렸던 것은 MAC ADDRESS 충돌로 확인되어
해결을 하였습니다.

이번에 문제는 TCP server Mode 와 Client 모드가 동시에 동작 하는지에 대해 문의를 드립니다.

처음 Init Socket을 하게 되는데 W5100에는 Socket가 4개가 있는 것으로 알고 있습니다. 0번은 Server Mode
1번은 Client Mode로 사용을 하려고 합니다.
처음 Booting시, init 진행 부분입니다.
void tcpSetNetInit(int8u *_ip,int8u *_mask,int8u _gw,int8u _dns,int8u _mac)
{
setMR(MR_RST); // MR_RST: 0x80
setSHAR(_mac);
setSUBR((uint8
)_mask);
setSIPR((uint8
)_ip);
setGAR((uint8
)_gw);

sysinit(MY_NET_MEMALLOC, MY_NET_MEMALLOC); // NetConf.Mem_alloc, NetConf.Mem_alloc  

}

int InitSocketServer(int32u _socket, int16u _port)
{
int nRet;
int8u flag = 0x00;
nRet = socket(_socket, Sn_MR_TCP, _port, flag);
if(0 == nRet)
{
return -101;
}

nRet = listen(_socket);
if(0 == nRet)
{
	return -102;
}
return 0;

}

그리고 부팅시 init후,
Minintick이 동작을 하며 함수를 보며 체크를 합니다.

ProcessTcpClient(char* _server_ip,int16u server_port);
ProcessTcpSever(int16u _port);
현재 이렇게 Socket 두개로 동작을 확인 하려고 하는데
자꾸 폴트가 걸려서 진도가 안나갑니다.
ServerMode일때는 Server모드로 동작해야하고 Client Mode일때는 Client만 사용을 하여야 하는 건가요?

클라이언트에서 데이터를 받고 일정 주기별로 다시 서버로 전송 하는 것을 하려고 하는데

Socket 2개로 제어가 불가능 한가요?

빠른 답변 부탁드립니다…

, eTCP_SERVER_SOCKET = 1
, eTCP_CLIENT_SOCKET = 0

으로 셋팅이 되어있습니다.

void ProcessTcpSever(int16u _port)
{
int8u s = eTCP_SERVER_SOCKET;
int8u sstate = getSn_SR(s);

switch (sstate)
{
case SOCK_INIT:
  	break;
case SOCK_LISTEN:
  	break;
case SOCK_SYNSENT:
	break;
case SOCK_SYNRECV:
	break;
case SOCK_FIN_WAIT:
	break;
case SOCK_CLOSING:		
	break;
case SOCK_TIME_WAIT:
	break;
case SOCK_LAST_ACK:
	break;
case SOCK_UDP:
	break;
case SOCK_IPRAW:
	break;
case SOCK_MACRAW:
	break;
case SOCK_PPPOE:
	break;
case SOCK_ESTABLISHED:
	{
		int rcvLen = getSn_RX_RSR(s);
		if(0 < rcvLen)onServerRcvData(rcvLen,s);
		
	}
break;
	
case SOCK_CLOSE_WAIT:
	{
		
		int rcvLen = getSn_RX_RSR(s);
		if(0 < rcvLen)onServerRcvData(rcvLen,s);
		disconnect(s);
	}
	break;
	
case SOCK_CLOSED:
	InitSocketServer(s, _port);
	break;
}

}

void ProcessTcpClient(char* _server_ip,int16u server_port)
{
int8u s = eTCP_CLIENT_SOCKET;
int32u len=0;
int32u length=0;
int32u idx=0;

switch(getSn_SR(s))
{
case SOCK_ESTABLISHED:
	 
	len = getSn_RX_RSR(s);
            if(len != 0)
	{
		 
		if(len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;
		length = recv(s, (char*)TCP_MSG, len);
		idx = 0;

		disconnect(s);
		break;
	}
	
	

	if(NULL != TCP_SEND_DATA)
	{
		P_TCP_TIME_OUT =  GetCurrentTime();
		len = strlen(TCP_SEND_DATA);
		length = send(s, (char*)TCP_SEND_DATA, len);
		TCP_SEND_DATA = NULL;
		break;
	}
	
	if( 2 > m_SokStatus1)
	{
		disconnect(s);
		break;
	}
	if(2 < (emberAfGetCurrentTime()-P_TCP_TIME_OUT))//3s TimeOut....
	{
		disconnect(s);
		break;
	}
	m_SokStatus1 = 3;
	break;
    
case SOCK_CLOSE_WAIT:
	disconnect(s);
    m_SokStatus1 = 0;
	break;
case SOCK_CLOSED:
	if(m_SokStatus1 != 1)
    {
    	break;
	}
	
	int nRet = socket(s, Sn_MR_TCP, server_port, 0x00);
	if(0 == nRet)    
	{
    	m_SokStatus1 = 0;
	}
    else
    {
		delay_us(1000);
    	connect(s, _server_ip, server_port);
		m_SokStatus1 = 2;
	}       
    break;
}

}


#2

안녕하세요 고객님.

소켓별로 server 또는 client로 동작이 가능합니다.

그리고 문제가 발생하는 시점이 언제인지 또한 어떤 문제가 발생하는지 명확하게 알려 주시면

문제해결에 도움이 될 것 같습니다.

감사합니다.