zoukankan      html  css  js  c++  java
  • socket编程中客户端常用函数 以及简单实现

    1 常用函数

    1.1   connect()

    int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen);

      客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。connect()成功返回0,出错返回-1,程序会阻塞。

    1.2   bind():很少用

      由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。

    2 客户端的简单实现(C语言)

    功能:连接到服务器后,如果服务器发送数据,则返回服务器发送的数据

    unsigned char TcpRecvBuf[1520]  /* 缓存区,完整的以太帧最大也就1520或1518字节,如果去掉协议部分则可以更小 */
    static  void Task_TCP_Client (void *pdata)
    {
        struct sockaddr_in  server, client;    
        int                 sock,   iState;
        int                 statusOk = 0;
        
        struct ip_addr stIpAddr;
        IP4_ADDR(&stIpAddr, REMOTE_IP_0, REMOTE_IP_1, REMOTE_IP_2, REMOTE_IP_3);
        server.sin_family       = AF_INET;                        /* 服务器地址类型为IPV4 */
        server.sin_port         = htons(80);                      /* 服务器的端口号为5000 */
        server.sin_addr.s_addr   = stIpAddr.addr;                 /* 服务器的IP地址      */
       /*
         * 以下4行为设置客户端的属性,可以不要,有系统自动分配端口号。即不调用bind函数。
         */
        client.sin_family       = AF_INET;
        client.sin_port         = htons( 4000 );                  /* 设置客户端的端口      */
        client.sin_addr.s_addr  = htonl( INADDR_ANY );
        bind( sock, (struct sockaddr *)&client, sizeof( client ) );/* 绑定本地接口         */
        sock = socket( AF_INET, SOCK_STREAM, 0 );                /* 使用TCP连接           */
        /*
         * 试图与服务器建立连接,阻塞程序
         */
        iState = connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr));
        while(1) { 
            statusOk = read(sock, TcpRecvBuf, sizeof(TcpRecvBuf));
            if (statusOk > 0) {
                statusOk = write(sock, TcpRecvBuf,statusOk);
            }
            if (statusOk <= 0){ 
                iState = -1;
                while (iState == -1) {
                    close( sock );                                /* 关闭此连接             */
                   /*
                    * 下面将重新与服务器建立连接
                    */
                    sock = socket( AF_INET, SOCK_STREAM, 0 );        /* 使用TCP连接         */
                    bind( sock, (struct sockaddr *)&client, sizeof( client ) );/* 绑定本地接口  */
                    iState = connect(sock, (struct sockaddr *)&server, sizeof( server ));
                    OSTimeDly(100); // 延迟一会儿,(ucos-ii的延迟函数,可以用其它延迟函数替代)
                }
            }
        }
    }
  • 相关阅读:
    工作流资源模式
    工作流资源模式
    工作流资源模式
    工作流资源模式
    工作流模式-工作流资源模式43种
    pmbok中文第六版官方在线版(班主任推荐)
    PMP项目管理知识体系指南(PMBOK指南)第六版,无水印、无密码、带目录、高清
    五、行为型模式
    四、结构型模式
    一、UML
  • 原文地址:https://www.cnblogs.com/mddblog/p/4503080.html
Copyright © 2011-2022 走看看