通过测试排除了一些问题

This commit is contained in:
2026-07-19 04:32:18 +08:00
parent 1669cd216d
commit 4eb728583b
12 changed files with 1379 additions and 183 deletions

View File

@@ -328,7 +328,41 @@ int net_bind(int sockfd, const struct net_sockaddr *addr, int addrlen)
/* 设置本地端口(转换为主机序) */
sock->local_port = net_ntohs(addr_in->sin_port);
sock->state = NET_SOCK_STATE_BOUND;
/* UDP (SOCK_DGRAM): 直接在此打开 CH395F Socket */
if (sock->type == NET_SOCK_DGRAM)
{
uint8_t status;
/* Socket 4-7 默认无收发缓冲,需显式分配 */
if (sockfd >= 4)
{
ch395f_set_send_buf((uint8_t)sockfd, 28, 2);
ch395f_set_recv_buf((uint8_t)sockfd, 30, 2);
}
ch395f_set_proto_type((uint8_t)sockfd, CH395F_PROTO_TYPE_UDP);
ch395f_set_sour_port((uint8_t)sockfd, sock->local_port);
/* DesIP=0xFFFFFFFF → UDP Server 模式(接受任意来源) */
{
uint8_t broadcast[4] = {0xFF, 0xFF, 0xFF, 0xFF};
ch395f_set_des_ip((uint8_t)sockfd, broadcast);
}
ch395f_set_des_port((uint8_t)sockfd, 0);
status = ch395f_open_socket((uint8_t)sockfd);
if (status != CH395F_ERR_SUCCESS)
{
s_net_errno = NET_ERR_BUSY;
return -1;
}
sock->state = NET_SOCK_STATE_UDP_OPEN;
}
else
{
sock->state = NET_SOCK_STATE_BOUND;
}
return 0;
}
@@ -377,9 +411,15 @@ int net_listen(int sockfd, int backlog)
ch395f_tcp_listen(sockfd);
/* 多连接模式:为数据 Socket 设置协议类型和源端口(不 OPEN
* Socket 4-7 默认无收发缓冲,需在此分配
* CH395F 根据这些信息在客户端连接时自动分配空闲 Socket */
for (int ds = NET_TCP_SERVER_DATA_SOCK_START; ds < NET_MAX_SOCKETS; ds++)
{
if (ds >= 4)
{
ch395f_set_send_buf((uint8_t)ds, 28, 2);
ch395f_set_recv_buf((uint8_t)ds, 30, 2);
}
ch395f_set_proto_type((uint8_t)ds, CH395F_PROTO_TYPE_TCP);
ch395f_set_sour_port((uint8_t)ds, sock->local_port);
}
@@ -798,11 +838,12 @@ int net_recvfrom(int sockfd, void *buf, int len, int flags,
{
struct net_sockaddr_in *addr_in = (struct net_sockaddr_in *)src_addr;
addr_in->sin_family = NET_AF_INET;
addr_in->sin_port = net_htons((uint16_t)(header[4] | (header[5] << 8)));
addr_in->sin_addr.s_addr = ((uint32_t)header[0]) |
((uint32_t)header[1] << 8) |
((uint32_t)header[2] << 16) |
((uint32_t)header[3] << 24);
/* CH395F UDP 头: [0-1] reserved [2-3] src_port(LE) [4-7] src_ip */
addr_in->sin_port = net_htons((uint16_t)(header[2] | (header[3] << 8)));
addr_in->sin_addr.s_addr = ((uint32_t)header[4]) |
((uint32_t)header[5] << 8) |
((uint32_t)header[6] << 16) |
((uint32_t)header[7] << 24);
*addrlen = sizeof(struct net_sockaddr_in);
}
}