Popo 发表于 2010-11-30 16:51:19

哪位有linux telnet客户端 C 的例程?

在网上找了一下,有服务器端的telnet例程,但找不到客户端的。

lj2505 发表于 2010-11-30 16:55:33

putty

mail2li 发表于 2010-11-30 17:07:37

busybox源码中有一个telnet的实现 非常简单 很容易移植

Popo 发表于 2010-12-3 13:34:34

找到资料了,用了三个函数
connect();send();recv();

其中connect();send()两个函数运行成功;

recv()失败

大致写法如下

connect主机+端口号
send   发了2个字符(send的返回值为2)

200ms之后
recv   (返回-1,表示失败)

问题:是否在使用recv()之前,要使用listen或accept函数呢?

mail2li 发表于 2010-12-3 14:47:21

这个是我以前port的busybox的telnet ucos+uctcpip的arm7平台
主流程你可以参考下
int telnet_main(int argc , char **argv)
{
    extern NET_IP_ADDR   ip;    // local ip
    struct in_addr remote_ip = { htonl(ip) };
    in_port_t remote_port = htons(23);
    struct sockaddr_in remot_socket;
    structfd_set readfds;
    int maxfd;
    structtimeval net_rd_ov = {0,50*1000};    //50ms

    int len;
    int ch;

    if(argc >= 1)
    {
      in_addr_t tmp_ip = inet_addr(argv);
      if(tmp_ip != 0xFFFFFFFF && tmp_ip != 0)
            remote_ip.s_addr = tmp_ip;
    }
    if(argc >=2 )
    {
      int p = atoi(argv);
      if(p>0 && p<0xffff)
            remote_port = htons(p);
    }

    INIT_G();

    printf(">> Remot %s : %d\n", inet_ntoa(remote_ip) , ntohs(remote_port));

    // creat a socket
    memset(&remot_socket, 0, sizeof(struct sockaddr_in)); // clear our address
    remot_socket.sin_family = AF_INET;
    remot_socket.sin_addr   = remote_ip;    // host address
    remot_socket.sin_port   = remote_port;// port number

    if ((netfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) // create socket
    {
      TRACE_ERROR("create socket fail\n");
      return(-1);
    }

    if(connect(netfd, (struct sockaddr *)&remot_socket, sizeof(struct sockaddr)) < 0)
    {
      TRACE_ERROR("connect fail\n");
      doexit(-2);
    }

    FD_ZERO(&readfds);
    FD_SET(netfd, &readfds);
    maxfd = netfd + 1;

    while (1)
    {
      struct fd_set rfds = readfds;
      switch (select(maxfd, &rfds, NULL, NULL, &net_rd_ov))
      {
      case 0:
            /* timeout */
            break;
      case -1:
            TRACE_INFO("Connection error\n");
            sleep(1);
            break;
      default:
            if (FD_ISSET(netfd, &rfds))
            {
                len = recv(netfd, G.buf, DATABUFSIZE, MSG_DONTWAIT);

                if (len <= 0)
                {
                  TRACE_INFO("Connection closed by foreign host\n");
                  doexit(EXIT_FAILURE);
                }
                //TRACE_DEBUG("Read netfd (%d): %d\n", netfd, len);
                handle_net_input(len);
            }
            break;
      }

      // key in handle
      len = 0;
      while( (ch = tty->getc(-1)) > 0 && len < DATABUFSIZE )
      {
            if((char)ch != 0x03)
                G.key = (char)ch;
            else
            {
                TRACE_INFO("BYE\n");
                doexit(EXIT_SUCCESS);
            }
      }
      if(len > 0)
      {
            //TRACE_DEBUG("Read console: %d\n", len);
            handle_net_output(len);
      }
    } /* while (1) */

}

maimaige 发表于 2013-3-8 15:40:57

mark 一下 telnet 编程
页: [1]
查看完整版本: 哪位有linux telnet客户端 C 的例程?