通过测试排除了一些问题
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user