www.pudn.com > uCOSII上实现的tcpip.rar > zsocket.c


#include "include/zsocket.h"
#include "include/zudp.h"
#include "include/ztcp.h"


static zsocket_t	_zsockets_table[ZNET_MAX_USER + 1];

static u16_t get_next_port(void)
{
	static u16_t init_port = 4096;
	return init_port++;
}


void zsocket_init(void)
{
	u8_t	i;
	
	for ( i = 0; i < ZNET_MAX_USER + 1; i++)
	{
		_zsockets_table[i]._id = 0;
		_zsockets_table[i]._lipaddr = IPADDRANY;
		_zsockets_table[i]._ripaddr = IPADDRANY;
		_zsockets_table[i]._lport	= -1;
		_zsockets_table[i]._rport	= -1;
		_zsockets_table[i]._pnetif 	= NULL;
	}
}


s8_t zsocket(protocol_t type)
{
	s8_t i, j = ZNET_MAX_USER + 1;
	
	for ( i = 1; i < ZNET_MAX_USER + 1; i++)
	{
		if ( _zsockets_table[i]._id == 0)
		{
			j = i;
			break;		
		}	
	}

	if ( j > ZNET_MAX_USER )
	{
		return -1;
	}
	_zsockets_table[j]._id = j;
	_zsockets_table[j]._pnetif = &default_netif;
	_zsockets_table[j]._proto = type;
	_zsockets_table[j]._lipaddr = default_netif.ipaddr;
	_zsockets_table[j]._lport = get_next_port();
	_zsockets_table[j]._task_id = sys_current_task();
	switch(type)
	{
		case data_packet:
				if ( udp_open(&_zsockets_table[j]) !=0 )
				{
					_zsockets_table[j]._id = 0;
					_zsockets_table[j]._lipaddr = IPADDRANY;
					_zsockets_table[j]._ripaddr = IPADDRANY;
					_zsockets_table[j]._lport	= -1;
					_zsockets_table[j]._rport	= -1;
					_zsockets_table[j]._pnetif 	= NULL;
					return -1;
				}
				break;	
		case data_stream:
				if ( tcp_open( &_zsockets_table[j] ) != 0)
				{
					_zsockets_table[j]._id = 0;
					_zsockets_table[j]._lipaddr = IPADDRANY;
					_zsockets_table[j]._ripaddr = IPADDRANY;
					_zsockets_table[j]._lport	= -1;
					_zsockets_table[j]._rport	= -1;
					_zsockets_table[j]._pnetif 	= NULL;
					return -1;
				}
	
				break;
	}	
	return j;	
}


u8_t zbind(s8_t sid, ipaddr_t *localip, u16_t *localport)
{
	
	if (!(sid > 0 && _zsockets_table[sid]._id == sid))
	{
		return -1;
	}
	
	if ( *localip == IPADDRANY)
	{
		_zsockets_table[sid]._lipaddr = default_netif.ipaddr;
	}
	else
	{
		_zsockets_table[sid]._lipaddr = *localip;
	}
	
	if ( *localport == (u16_t)(-1) )
	{
		 _zsockets_table[sid]._lport = get_next_port();
	}
	else
	{
		_zsockets_table[sid]._lport = *localport;
	}
	return 0;

}

zsocket_t	*query_zsocket(s8_t sid)
{
	if (!(sid > 0 && _zsockets_table[sid]._id == sid))
	{
		return NULL;
	}
	return &_zsockets_table[sid];
}

u8_t zclose(s8_t sid)
{
	zsocket_t	*psocket;
	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}
	
		
	switch( psocket->_proto )
	{
		case data_packet:
			udp_close(psocket);
			break;
		case data_stream:
			tcp_close(psocket);
			break;
	}
	
	if ( psocket->_proto  != data_stream)
	{	
		sys_enter_critical();
		_zsockets_table[sid]._id = 0;
		sys_exit_critical();
	}
	
	return 0;
}


u8_t zshutdown(s8_t sid)
{
	 zsocket_t   *psocket;
     psocket = query_zsocket(sid);

 	 if (psocket == NULL)
	{
		return -1;
	}
	
	 sys_enter_critical();
	 _zsockets_table[sid]._id = 0;
	 sys_exit_critical();
	return 0;	 
}

/****************************************************
 * define UDP recv and send for UDP socket
 *
 ***********************************************/

u8_t zrecvfrom(s8_t sid, zbuffer_t **pbuf, ipaddr_t *rip, u16_t *rport, u8_t flags)
{
	zsocket_t	*psocket;

	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}

	if ( psocket->_proto != data_packet )
	{
		return -1;
	}

	return udp_recv( psocket, rip, rport, pbuf, flags);

}

u8_t zsendto(s8_t sid, u8_t *pdata, u16_t *len,ipaddr_t *rip, u16_t *rport)
{
	zsocket_t	*psocket;

	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}

	if ( psocket->_proto != data_packet )
	{
		return -1;
	}
	
	return udp_send(psocket, rip, rport, pdata, len);
}


/***********************************
 * TCP simple function for user
 ***********************************/

u8_t zlisten(s8_t sid)
{
	zsocket_t   *psocket;

	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}

	if ( psocket->_proto != data_stream )
	{
		return -1;
	}

	return tcp_listen(psocket);
}


s8_t zaccept(s8_t sid)
{
	zsocket_t   *psocket;

	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}

	if ( psocket->_proto != data_stream )
	{
		return -1;
	}

	return tcp_accept(psocket);
}


u8_t zrecv(s8_t sid, zbuffer_t **ppbuf, u8_t flags)
{
	zsocket_t   *psocket;

	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}

	if ( psocket->_proto != data_stream )
	{
		return -1;
	}

	return tcp_recv(psocket, ppbuf, flags); 	
}


u8_t zsent(s8_t sid, u8_t *pdata, u16_t *plen, u8_t flags)
{

	zsocket_t   *psocket;

	psocket = query_zsocket(sid);

	if (psocket == NULL)
	{
		return -1;
	}

	if ( psocket->_proto != data_stream )
	{
		return -1;
	}

	return tcp_sent(psocket, pdata, plen, flags);

}