⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zsocket.c

📁 uCOSII上实现的tcpip协议实现代码(gcc编译)
💻 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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -