• C/S架构学习之TCP客户端


    • TCP客户端的实现流程:
    • 一、创建套接字(socket函数):
    • 通信域选择IPV4网络协议流式套接字
    	int sockfd = socket(AF_INET,SOCK_STREAM,0); 
    
    • 1
    • 二、填充服务器的网络信息结构体(struct sockaddr_in serveraddr):
    • 1.定义网络信息结构体变量;
    • 2.求出结构体变量的内存空间大小
    • 3.结构体清零
    • 4.使用IPV4网络协议
    • 5.预留给在终端输入的网络字节序的端口号
    • 6.预留给在终端输入的IP地址
    	struct sockaddr_in serveraddr; 
        socklen_t serveraddrlen = sizeof(serveraddr);
        memset(&serveraddr,0,serveraddrlen); 
        serveraddr.sin_family = AF_INET;  
        serveraddr.sin_addr.s_addr = inet_addr(argv[1]); 
        serveraddr.sin_port = htons(atoi(argv[2]));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 三、与服务器端建立连接(connect函数):
    	int ret = connect(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen);
    
    • 1
    • 四、向服务器发送数据(send函数)和接收来自服务器端的应答消息(recv函数):
    	//向服务器发送数据
    	send(sockfd,buf,sizeof(buf),0);
    	//接收来自服务器端的应答消息
    	recv(sockfd,buf,sizeof(buf),0);
    	printf("应答:[%s]\n",buf);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 五、关闭套接字(close函数):
    	close(sockfd);
    
    • 1
    • 综合应用实例代码如下所示:
    //tcp客户端
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define ERRLOG(msg) do{\
                            printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
                            perror(msg);\
                            exit(-1);\
                    }while(0)
    
    int main(int argc, char const *argv[])
    {
        //入参合理性检查
        if(3 != argc)
        {
            printf("Usage : %s  \n",argv[0]);
            exit(-1);
        }
        //创建套接字
        int sockfd = socket(AF_INET,SOCK_STREAM,0);
        if(-1 == sockfd)
        {
            ERRLOG("socket error");
        }
        printf("sockfd = %d\n",sockfd);
        //填充服务器网络信息结构体
        struct sockaddr_in serveraddr;
        socklen_t serveraddrlen = sizeof(serveraddr);
    
        memset(&serveraddr,0,serveraddrlen);
    
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
        serveraddr.sin_port = htons(atoi(argv[2]));
      
    
        //与服务器建立连接
        if(-1 == connect(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen))
        {
            ERRLOG("connect error");
        }
        printf("与服务器连接成功\n");
        //收发数据
        char buf[128] = {0};
        while(1)
        {
            memset(buf,0,128);
            //在终端获取数据
            fgets(buf,128,stdin);
            buf[strlen(buf)-1] = '\0';//清理结尾的\n
            //把数据发给服务器
            if(-1 == send(sockfd,buf,sizeof(buf),0))
            {
                ERRLOG("send error");
            }
            if(!strncmp(buf,"quit",4))
            {
                break;
            }
            //接受服务器发回来的应答消息
            memset(buf,0,sizeof(buf));
            if(-1 == recv(sockfd,buf,sizeof(buf),0))
            {
                ERRLOG("recv error");
            }
            //打印应答消息
            printf("应答:[%s]\n",buf);
    
        }
        //关闭套接字
        close(sockfd);
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 本示例代码,仅供参考;
  • 相关阅读:
    Elasticsearch深入理解(十三)——Index更换字段类型的三种方式
    React之组件间过渡动画如何实现
    ik分词器的基本使用
    【PTA刷题】请编写函数,求子串(详解+代码)
    刷题知识回顾《五》二叉树的最近公共祖先
    大一新生HTML期末作业 个人旅游图片博客HTML5 用DIV+CSS技术设计的个人网站(web前端网页制作课作业)
    Gin 框架之jwt 介绍与基本使用
    以一个实例看Mule3.0中的Flow
    接口自动化测试实践指导(上):接口自动化需要做哪些准备工作
    【笔试强训】除2!
  • 原文地址:https://blog.csdn.net/qq_41878292/article/details/133279558