📄 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -