FTP可以上传文件
This commit is contained in:
@@ -7,30 +7,40 @@
|
||||
|
||||
int lftpd_inet_listen(int port)
|
||||
{
|
||||
int s = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
|
||||
if (s < 0) {
|
||||
DBG_ERROR("error creating listener socket");
|
||||
return -1;
|
||||
}
|
||||
int retry;
|
||||
int s;
|
||||
|
||||
struct net_sockaddr_in addr;
|
||||
addr.sin_family = NET_AF_INET;
|
||||
addr.sin_port = net_htons((uint16_t)port);
|
||||
addr.sin_addr.s_addr = 0;
|
||||
for (retry = 0; retry < 5; retry++) {
|
||||
s = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
|
||||
if (s < 0) {
|
||||
if (retry == 0) DBG_ERROR("create socket");
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
continue;
|
||||
}
|
||||
|
||||
struct net_sockaddr_in addr;
|
||||
addr.sin_family = NET_AF_INET;
|
||||
addr.sin_port = net_htons((uint16_t)port);
|
||||
addr.sin_addr.s_addr = 0;
|
||||
|
||||
if (net_bind(s, (struct net_sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
DBG_ERROR("bind port %d", port);
|
||||
net_close(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (net_listen(s, 0) >= 0) {
|
||||
return s;
|
||||
}
|
||||
|
||||
if (net_bind(s, (struct net_sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
DBG_ERROR("error binding listener port %d", port);
|
||||
net_close(s);
|
||||
return -1;
|
||||
if (retry < 4) {
|
||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||
}
|
||||
}
|
||||
|
||||
if (net_listen(s, 0) < 0) {
|
||||
DBG_ERROR("error listening on socket");
|
||||
net_close(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return s;
|
||||
DBG_ERROR("listen failed after 5 retries (total 10s wait)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lftpd_inet_listen_multi(int port, int backlog)
|
||||
@@ -81,10 +91,33 @@ int lftpd_inet_accept(int socket)
|
||||
if (s >= 0) {
|
||||
return s;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
}
|
||||
|
||||
int lftpd_inet_accept_timeout(int socket, int timeout_ms)
|
||||
{
|
||||
int elapsed = 0;
|
||||
|
||||
while (elapsed < timeout_ms) {
|
||||
int s = net_accept(socket, NULL, NULL);
|
||||
if (s >= 0) {
|
||||
return s;
|
||||
}
|
||||
/* 数据连接已被对端关闭时提前退出,不等待超时 */
|
||||
net_sock_t *p_sock = net_get_sock(socket);
|
||||
if (p_sock == NULL || p_sock->state != NET_SOCK_STATE_LISTENING) {
|
||||
DBG_ERROR("data socket closed, accept aborted");
|
||||
return -1;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
elapsed += 100;
|
||||
}
|
||||
|
||||
DBG_ERROR("accept timeout (%dms)", timeout_ms);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lftpd_inet_read_line(int socket, char *buffer, size_t buffer_len)
|
||||
{
|
||||
memset(buffer, 0, buffer_len);
|
||||
|
||||
Reference in New Issue
Block a user