doubao_chat/apps/common/eth/w5500/w5500_socket.h

137 lines
3.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef SOCKET_H
#define SOCKET_H
#include "string.h"
#include "stdio.h"
#include "includes.h"
#include "os/os_api.h"
#include "w5500.h"
#define socket_log printf
#define SOCKET_MAX_NUM 8//最大socket数量
#define SOCKET_MAX_SIZE 1460//一次接收最大字节数
#define LOCAL_DEFAULT_PORT 54321 //默认本地端口号
/* 错误类型 */
#ifndef ENONE
#define ENONE 0 //无措
#endif
#ifndef ETIMOUT
#define ETIMOUT 1 //超时
#endif
#ifndef EDISCON
#define EDISCON 2 //其他错误
#endif
#ifndef ENOMEM
#define ENOMEM 3 //内存不足
#endif
#ifndef EFAULT
#define EFAULT 4 //其他错误
#endif
typedef unsigned char u8_t, u8, sa_family_t;
typedef unsigned short u16_t, u16, in_port_t;
typedef unsigned int u32_t, u32, in_addr_t;
typedef unsigned long long u64_t, u64;
enum protocol_type {
NONE_PROTOCOL = 0,
TCP_PROTOCOL,//TCP协议
UDP_PROTOCOL,//UDP协议
};
enum mode_type {
NONE_MODE = 0,
TCP_SERVER_MODE,//TCP服务器模式
TCP_CLIENT_MODE,//TCP客户端模式
UDP_BROADCAST_MODE,//UDP广播模式
};
typedef struct socket_protocol {
/* 初始化只需要配置这3个参数即可 */
unsigned char prot;//TCP_PROTOCOL 或者 UDP_PROTOCOL
unsigned char mode;//TCP_SERVER_MODE 或者 TCP_CLIENT_MODE UDP_BROADCAST_MODE
unsigned int time_out;//发送和接收超时,0永不超时,单位毫秒
unsigned short local_port;//本地端口号
unsigned short remote_port;//远程目标端口号
unsigned int local_ip;//本地IP地址,可以使用inet_addr()转换赋值
unsigned int remote_ip;//远程目标IP地址,可以使用inet_addr()转换赋值
unsigned char socket_port;//socket_malloc返回的socket端口号
unsigned char status;//socket状态标记
volatile unsigned char lock;//多核情况下的锁住status
#if OS_SUPPORT
OS_SEM irq_sem;
#endif
} SOCKET_INFO;
#define socket_lock(x) {while(x);(x) = 1;}
#define socket_unlock(x) {(x) = 0;}
extern void socket_interrupt(void);
extern int socket_create(SOCKET_INFO *socket);
extern int socket_accept(SOCKET_INFO *socket, u32 accpet_timeout);//TCP 服务器模式下
extern int socket_connect(SOCKET_INFO *socket);//TCP 客户端模式下
extern int socket_recv(SOCKET_INFO *socket, u8 *buf, u32 size);
extern int socket_send(SOCKET_INFO *socket, u8 *buf, u32 size);
extern void socket_close(SOCKET_INFO *socket);
extern int rand(void);
static inline unsigned int inet_addr(char *addr)//字符串IP转网络IP地址
{
unsigned char ip[3] = {0};
unsigned char value = 0;
unsigned char comma = 0;
unsigned int i = 0;
unsigned int ret = 0;
while (addr[i] != '\0') {
if (addr[i] >= '0' && addr[i] <= '9') {
ip[i] = addr[i] - '0';
i++;
} else if (addr[i] == '.') {
addr += i + 1;
switch (i) {
case 1:
value = ip[0];
break;
case 2:
value = ip[0] * 10 + ip[1];
break;
case 3:
value = ip[0] * 100 + ip[1] * 10 + ip[2];
break;
}
ret |= value << (comma * 8);
comma++;
i = 0;
ip[0] = 0;
ip[1] = 0;
ip[2] = 0;
}
}
switch (i) {
case 1:
value = ip[0];
break;
case 2:
value = ip[0] * 10 + ip[1];
break;
case 3:
value = ip[0] * 100 + ip[1] * 10 + ip[2];
break;
}
ret |= value << (comma * 8);
return ret;
}
static inline unsigned short htons(unsigned short port)//字符串IP转网络IP地址
{
unsigned short ret = 0;
// ret |= ((port>>8) & 0xff ) | ((port& 0xff)<<8);
ret |= port;
return ret;
}
#endif