搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2010-11-30 16:51:19 | 显示全部楼层 |阅读模式
在网上找了一下,有服务器端的telnet例程,但找不到客户端的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入0汤圆

发表于 2010-11-30 16:55:33 | 显示全部楼层
putty

出0入0汤圆

发表于 2010-11-30 17:07:37 | 显示全部楼层
busybox源码中有一个telnet的实现 非常简单 很容易移植

出0入0汤圆

 楼主| 发表于 2010-12-3 13:34:34 | 显示全部楼层
找到资料了,用了三个函数
connect();send();recv();

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

recv()失败

大致写法如下

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

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

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

出0入0汤圆

发表于 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;
    struct  fd_set readfds;
    int maxfd;
    struct  timeval net_rd_ov = {0,50*1000};    //50ms

    int len;
    int ch;

    if(argc >= 1)
    {
        in_addr_t tmp_ip = inet_addr(argv[0]);
        if(tmp_ip != 0xFFFFFFFF && tmp_ip != 0)
            remote_ip.s_addr = tmp_ip;
    }
    if(argc >=2 )
    {
        int p = atoi(argv[1]);
        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[len++] = (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) */

}

出0入0汤圆

发表于 2013-3-8 15:40:57 | 显示全部楼层
mark 一下 telnet 编程
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 07:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表