• 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的延迟函数,可以用其它延迟函数替代)
                }
            }
        }
    }
  • 相关阅读:
    53. Maximum Subarray
    64. Minimum Path Sum
    28. Implement strStr()
    26. Remove Duplicates from Sorted Array
    21. Merge Two Sorted Lists
    14. Longest Common Prefix
    7. Reverse Integer
    412. Fizz Buzz
    linux_修改域名(centos)
    linux_redis常用数据类型操作
  • 原文地址:https://www.cnblogs.com/mddblog/p/4503080.html
Copyright © 2020-2023  润新知