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