--- lbbs/src/bbs_net.c 2025/10/08 03:34:52 1.62 +++ lbbs/src/bbs_net.c 2025/10/16 11:26:16 1.64 @@ -293,6 +293,9 @@ int bbsnet_connect(int n) int tos; char remote_addr[IP_ADDR_LEN]; int remote_port; + char local_addr[IP_ADDR_LEN]; + int local_port; + socklen_t sock_len; time_t t_used = time(NULL); struct tm *tm_used; int ch; @@ -472,9 +475,21 @@ int bbsnet_connect(int n) log_error("setsockopt IP_TOS=%d error (%d)\n", tos, errno); } + sock_len = sizeof(sin); + if (getsockname(sock, (struct sockaddr *)&sin, &sock_len) < 0) + { + log_error("getsockname() error: %d", errno); + goto cleanup; + } + + strncpy(local_addr, inet_ntoa(sin.sin_addr), sizeof(local_addr) - 1); + local_addr[sizeof(local_addr) - 1] = '\0'; + local_port = ntohs(sin.sin_port); + prints("\033[1;31m连接成功!\033[m\r\n"); iflush(); - log_common("BBSNET connect to %s:%d\n", remote_addr, remote_port); + log_common("BBSNET connect to %s:%d from %s:%d by [%s]\n", + remote_addr, remote_port, local_addr, local_port, BBS_username); input_cd = iconv_open(bbsnet_conf[n].charset, BBS_NET_DEFAULT_CHARSET); if (input_cd == (iconv_t)(-1)) @@ -885,8 +900,6 @@ int bbs_net() load_bbsnet_conf(CONF_BBSNET); - BBS_last_access_tm = time(NULL); - clearscr(); bbsnet_refresh(); display_menu(&bbsnet_menu); @@ -896,18 +909,26 @@ int bbs_net() { ch = igetch(100); + if (ch != KEY_NULL && ch != KEY_TIMEOUT) + { + BBS_last_access_tm = time(NULL); + } + switch (ch) { case KEY_NULL: // broken pipe - case KEY_ESC: - case Ctrl('C'): // user cancel + log_error("KEY_NULL\n"); goto cleanup; case KEY_TIMEOUT: if (time(NULL) - BBS_last_access_tm >= MAX_DELAY_TIME) { + log_error("User input timeout\n"); goto cleanup; } continue; + case KEY_ESC: + case Ctrl('C'): // user cancel + goto cleanup; case CR: igetch_reset(); bbsnet_connect(bbsnet_menu.menu_item_pos[0]); @@ -952,7 +973,6 @@ int bbs_net() bbsnet_selchange(); break; } - BBS_last_access_tm = time(NULL); } cleanup: