/[LeafOK_CVS]/lbbs/src/bbs_net.c
ViewVC logotype

Diff of /lbbs/src/bbs_net.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.32 by sysadm, Sun May 11 04:09:08 2025 UTC Revision 1.33 by sysadm, Sun May 11 06:04:55 2025 UTC
# Line 165  int bbsnet_connect(int n) Line 165  int bbsnet_connect(int n)
165          time_t t_used;          time_t t_used;
166          struct tm *tm_used;          struct tm *tm_used;
167          int ch;          int ch;
168            int offset;
169    
170          clearscr();          clearscr();
171    
# Line 288  int bbsnet_connect(int n) Line 289  int bbsnet_connect(int n)
289          }          }
290    
291          prints("\033[1;31m连接成功!\033[m\r\n");          prints("\033[1;31m连接成功!\033[m\r\n");
292            iflush();
293          log_std("BBSNET connect to %s:%d\n", remote_addr, remote_port);          log_std("BBSNET connect to %s:%d\n", remote_addr, remote_port);
294    
295          BBS_last_access_tm = t_used = time(0);          BBS_last_access_tm = t_used = time(0);
   
296          loop = 1;          loop = 1;
297    
298          while (loop && !SYS_server_exit)          while (loop && !SYS_server_exit)
# Line 300  int bbsnet_connect(int n) Line 301  int bbsnet_connect(int n)
301                  FD_SET(STDIN_FILENO, &read_fds);                  FD_SET(STDIN_FILENO, &read_fds);
302                  FD_SET(sock, &read_fds);                  FD_SET(sock, &read_fds);
303    
304                    FD_ZERO(&write_fds);
305                    FD_SET(STDIN_FILENO, &write_fds);
306                    FD_SET(sock, &write_fds);
307    
308                  timeout.tv_sec = 0;                  timeout.tv_sec = 0;
309                  timeout.tv_usec = 100 * 1000; // 0.1 second                  timeout.tv_usec = 100 * 1000; // 0.1 second
310    
311                  ret = select(sock + 1, &read_fds, NULL, NULL, &timeout);                  ret = select(sock + 1, &read_fds, &write_fds, NULL, &timeout);
312    
313                  if (ret == 0) // timeout                  if (ret == 0) // timeout
314                  {                  {
# Line 322  int bbsnet_connect(int n) Line 327  int bbsnet_connect(int n)
327                  }                  }
328                  else if (ret > 0)                  else if (ret > 0)
329                  {                  {
330                          if (FD_ISSET(STDIN_FILENO, &read_fds))                          if (FD_ISSET(STDIN_FILENO, &read_fds) && FD_ISSET(sock, &write_fds))
331                          {                          {
332                                    // Set STDIN as non-blocking
333                                    flags = fcntl(STDIN_FILENO, F_GETFL, 0);
334                                    fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
335    
336                                    log_std("Try read(STDIN)\n");
337    
338                                  len = read(STDIN_FILENO, buf, sizeof(buf));                                  len = read(STDIN_FILENO, buf, sizeof(buf));
339                                  if (len == 0)                                  if (len < 0)
340                                    {
341                                            if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)
342                                            {
343                                                    log_error("read(STDIN) error (%d)\n", errno);
344                                                    loop = 0;
345                                            }
346                                    }
347                                    else if (len == 0)
348                                  {                                  {
349                                            log_error("read(STDIN) reach EOF\n");
350                                          loop = 0;                                          loop = 0;
351                                  }                                  }
352                                  write(sock, buf, (size_t)len);                                  else
353                                    {
354                                            offset = 0;
355                                            do
356                                            {
357                                                    ret = (int)write(sock, buf + offset, (size_t)(len - offset));
358                                                    if (ret < 0)
359                                                    {
360                                                            log_error("write(socket) error (%d)\n", errno);
361                                                            loop = 0;
362                                                            break;
363                                                    }
364                                                    offset += ret;
365                                            } while (offset < len);
366    
367                                            BBS_last_access_tm = time(0);
368                                    }
369    
370                                  BBS_last_access_tm = time(0);                                  // Restore STDIN flags
371                                    fcntl(STDIN_FILENO, F_SETFL, flags);
372                          }                          }
373                          if (FD_ISSET(sock, &read_fds))                          if (FD_ISSET(sock, &read_fds) && FD_ISSET(STDIN_FILENO, &write_fds))
374                          {                          {
375                                    // Set socket as non-blocking
376                                    flags = fcntl(sock, F_GETFL, 0);
377                                    fcntl(sock, F_SETFL, flags | O_NONBLOCK);
378    
379                                    log_std("Try read(socket)\n");
380    
381                                  len = read(sock, buf, sizeof(buf));                                  len = read(sock, buf, sizeof(buf));
382                                  if (len == 0)                                  if (len < 0)
383                                  {                                  {
384                                            if (errno != EAGAIN && errno != EWOULDBLOCK && errno != EINTR)
385                                            {
386                                                    log_error("read(socket) error (%d)\n", errno);
387                                                    loop = 0;
388                                            }
389                                    }
390                                    else if (len == 0)
391                                    {
392                                            log_error("read(socket) reach EOF\n");
393                                          loop = 0;                                          loop = 0;
394                                  }                                  }
395                                  write(STDOUT_FILENO, buf, (size_t)len);                                  else
396                                    {
397                                            offset = 0;
398                                            do
399                                            {
400                                                    ret = (int)write(STDOUT_FILENO, buf + offset, (size_t)(len - offset));
401                                                    if (ret < 0)
402                                                    {
403                                                            log_error("write(STDOUT) error (%d)\n", errno);
404                                                            loop = 0;
405                                                            break;
406                                                    }
407                                                    offset += ret;
408                                            } while (offset < len);
409                                    }
410    
411                                    // Restore socket flags
412                                    fcntl(sock, F_SETFL, flags);
413                          }                          }
414                  }                  }
415          }          }


Legend:
Removed lines/characters  
Changed lines/characters
  Added lines/characters

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1