• 服务器往客户端发送字符串的网络编程


    服务器主要就是能够打开命令行提供的网络端口,然后一有客户端连接上,就会向客户端发送Welcome to Our Server!这段话。
    服务器代码serverSayWelcome.c的代码如下:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    // 输出错误并且向操作系统返回1,退出程序
    void errorPrint(char *errorMessage);
    
    
    int main(int argc,char *argv[]){
        // 服务器的套接字
        int serverSocket;
        // 客户端的套接字
        int clientSocket;
    
        // 服务器的地址结构
        struct sockaddr_in serverAddress;
        // 客户端的地址结构
        struct sockaddr_in clientAddress;
        // 客户端地址大小
        socklen_t clientAddress_size;
    
        // 输出到客户端的字符串
        char stringToClient[] = "Welcome to Our Server!";
    
        // 命令行需要输入两个参数,第二个参数需要输入端口号
        if(argc!=2){
            printf("%s needs a port!\n",argv[0]);
            exit(1);
        }
        
        // 获取服务器端的套接字
        serverSocket = socket(PF_INET,SOCK_STREAM,0);
    
        // 若是serverSocket等于-1,就说明出错了,需要输出"socket() wrong!"退出程序
        if(serverSocket==-1){
            errorPrint("socket() wrong!");
        }
    
        // 把serverAddress所有字节都填充为0
        memset(&serverAddress,0,sizeof(serverAddress));
    
        // 把sockaddr_in的值初始化
        serverAddress.sin_family = AF_INET;
        serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
        serverAddress.sin_port = htons(atoi(argv[1]));
        
        // 把地址和端口都绑定在操作系统上边,要是失败的话,会输出错误信息,退出程序
        if(bind(serverSocket,(struct sockaddr*)&serverAddress,sizeof(serverAddress))==-1){
                errorPrint("bind() wrong!");
        }
    
        // 把主动套接字变成被动套接字,能够监听其他主机发起连接,失败的话,会输出错误信息,退出程序
        if(listen(serverSocket,5)==-1){
             errorPrint("listen() wrong!");
        }
        
        // 把客户端地址大小clientAddress_size初识化
        clientAddress_size = sizeof(clientAddress);
        // 接受到其他用户的连接,
        clientSocket = accept(serverSocket,(struct sockaddr*) &clientAddress,&clientAddress_size);
        
        // 出错之后,会输出报错信息,退出程序
        if(clientSocket==-1){
             errorPrint("accept() wrong!");
        }
        
        // 向客户端输出“Welcome to Our Server!”
        write(clientSocket,stringToClient,sizeof(stringToClient));
        // 关闭客户端套接字
        close(clientSocket);
        // 关闭服务器套接字
        close(serverSocket);
        return 0;
    }
    
    void errorPrint(char *errorMessage){
        fputs(errorMessage,stderr);
        fputc('\n',stderr);
        exit(1);
    }
    
    • 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

    gcc serverSayWelcome.c -o serverSayWelcome进行编译,./serverSayWelcome 9190打开9190端口等待客户端连接。
    在这里插入图片描述

    客户端就会连接服务器,然后把string from server:连上服务器发送过来的Welcome to Our Server!字符串输出。
    客户端代码clientGetWelcome.c的代码如下:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    void errorPrint(char *errorMessage);
    
    int main(int argc,char *argv[]){
        int socketNumber;
        struct sockaddr_in serverAddress;
        char getString[100];
        int stringLength;
        if(argc!=3){
            printf("server IP or port lacks!\n",argv[0]);
            exit(1);
        }
    
        socketNumber = socket(PF_INET,SOCK_STREAM,0);
    
        if(socketNumber==-1){
            errorPrint("socket() is wrong!");
            exit(1);
        }
    
        memset(&serverAddress,0,sizeof(serverAddress));
    
        serverAddress.sin_family=AF_INET;
        serverAddress.sin_addr.s_addr=inet_addr(argv[1]);
        serverAddress.sin_port=htons(atoi(argv[2]));
    
        if(connect(socketNumber,(struct sockaddr*)&serverAddress,sizeof(serverAddress))==-1){
                errorPrint("connect() wrong!");
        }
    
        stringLength = read(socketNumber,getString,sizeof(getString)-1);
        if(stringLength==-1){
             errorPrint("read() is wrong!");
        }
    
        printf("string from server:%s\n",getString);
        close(socketNumber);
        return 0;
    }
    
    
    void errorPrint(char *errorMessage){
        fputs(errorMessage,stderr);
        fputc('\n',stderr);
        exit(1);
    }
    
    • 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

    gcc clientGetWelcome.c -o clientGetWelcome进行编译,./clientGetWelcome 127.0.0.1 9190连接到本机(127.0.0.1)的9190端口,然后就看到了string from server:Welcome to Our Server!这句话。
    在这里插入图片描述

    而服务端也退出了程序。
    在这里插入图片描述

    此文章为11月Day 9学习笔记,内容来源于极客时间《网络编程实战》

  • 相关阅读:
    上班族为何需要做副业?如何靠副业月入过万?
    pytest之parametrize()实现数据驱动
    HTML分类面试题
    BGP选路的十一条原则(第八课)
    【每日前端面经】2024-03-11
    golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?
    GFS 分布式文件系统
    vue中使用高德地图的热力图方法1
    前端知识案例学习1-css实现滚动贴合
    开赛在即 | 赛宁网安技术支撑第七届“蓝帽杯”决赛
  • 原文地址:https://blog.csdn.net/qq_42108074/article/details/134319052