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

news2024/12/26 23:33:19

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
// 输出错误并且向操作系统返回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);
}

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
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);
}

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学习笔记,内容来源于极客时间《网络编程实战》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ARM Trace32(劳特巴赫) 使用介绍 3 - trace32 访问运行时的内存】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 trace32 访问运行时的内存1.1.1 侵入式 运行时内存访问1.1.2 非侵入式运行时访问1.1.3 缓存一致性的非侵入式运行时访问 1.2 Trace32 侵入式和非侵入式 运行时访问1.2.1 侵入式访问1.2.2 非侵入式运行时访问 1…

C++:关联式容器map的使用

1、map的简介 map是关联容器&#xff0c;它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 在map中&#xff0c;键值key通常用于排序和惟一地标识元素&#xff0c;而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同&#xff0c;并…

【数据结构】树与二叉树(八):二叉树的中序遍历(非递归算法NIO)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

【Linux系统化学习】冯诺依曼体系结构 | 操作系统

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 目录 冯诺依曼体系结构 组成介绍 CPU和内存 以使用微信发消息为例理解冯诺依曼体系结构 操作系统 冯诺依曼体系结构 随着世界上第一台计算机ENIAC&#xff08;埃尼阿克&#xff09;的…

2、鸿蒙开发工具首次运行时开发环境配置

请务必在第一次运行时配置好开发环境&#xff0c;如果取消了配置&#xff0c;后续再配置会比较麻烦 1、点击工具图标运行 2、在欢迎页中点击“Agree” 3、默认“Do not import setting”&#xff0c;点击“OK” 3、此片设置Nodejs和Ohpm的安装&#xff0c;其中&#xff0c; …

传来喜讯,优维又获奖了!!!

优维科技作为国内DevOps领域的行业领先企业&#xff0c;从诞生之日起&#xff0c;就一直致力于为中国企业提供一流的数字化运维服务&#xff0c;不断深耕核心技术&#xff0c;向客户提供专业强大的产品与服务。多年来&#xff0c;不仅获得了大量客户认可&#xff0c;更是屡次获…

Apache Airflow (三) :Airflow WebUI操作介绍

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

Android修行手册 - POI操作Excel常用样式(字体,背景,颜色,Style)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

【媒体邀约】媒体宣传——企业成长的催化剂

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传是企业成长的催化剂&#xff0c;它在各种方面对企业的成功和发展起到了关键作用。 1. 曝光和知名度&#xff1a; 媒体宣传可以将企业和其产品或服务推向广泛的受众&#xff0c;…

SQL第四次上机实验

1.查询借阅了计算机类或者文学类图书的读者的借书证号 USE TSGL GO SELECT DISTINCT Reader.Lno FROM Book,Lend,Reader WHERE Book.ISBNLend.ISBN AND Lend.LnoReader.Lno AND Class 计算机类 OR Class 文学类2.查询同时借阅了计算机类和文学类图书的读者的借书证号 USE T…

C语言之文件操作(剩余部分)

上篇博客字数到极限了&#xff0c;给大家把内容补充在这一篇&#xff0c;我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍&#xff0c;让我们开始下面的学习吧&#xff01; 目录 1.文件读取结束的判定 1.1feof函数 1.2ferror函数 代码示例 2.文件缓冲区 2.1fflu…

制造行业怎么做?看低代码如何引领未来

随着科技的不断发展&#xff0c;制造行业正面临着巨大的变革和挑战。为了提高生产效率、降低成本并更好地适应快速变化的市场需求&#xff0c;越来越多的制造企业将目光投向了低代码开发平台。在众多低代码开发平台中&#xff0c;JNPF低代码快速开发平台凭借其卓越的性能和灵活…

“三门问题”解决方案:换不换?更换策略与贝叶斯策略?附 Java 验证代码

文章目录 前言一、什么是“三门问题”&#xff1f;二、“三门问题”解决策略详解2.1、错误策略&#xff1a;直觉策略与随机策略2.2、更换策略与事件分析计算2.3、贝叶斯策略及分析流程 三、Java 语言验证“三门问题”总结 前言 “三门问题”作为一道经典逻辑推理题&#xff0c;…

物联网AI MicroPython学习之语法 ustruct 打包和解压原始数据类型

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; ustruct 介绍 ustruct提供打包和解压原始数据类型的功能。 默认情况下&#xff0c;C类型以机器的本机格式和字节顺序表示&#xff0c;并在必要时通过跳过填充字节来正确对齐&#xff08;根据C编译器使用的规…

使用Vite创建Vue3项目 配置路由+路径(包教包会)

使用Vite创建Vue3项目 配置路由路径 一、创建项目&#xff1a;二、配置路由1. vue3vitets路由配置2. vue3vitejs路由配置 三、配置路径 一、创建项目&#xff1a; 创建一个文件夹在文件夹上的 地址栏 或者是 winR 打开cmd命令窗口。 输入命令 npm create vitelatest 这里我们…

飞控硬件介绍及其主要传感器特性解析

飞行控制器是无人机的关键组件之一&#xff0c;它主要由主控单片机、IMU传感器、电源和输出IO等部分构成。这些硬件和传感器的特性对于无人机的二次开发至关重要&#xff0c;其性能和质量直接关系到无人机的稳定性、飞行性能和功能扩展能力。 本文将带领新手开发者深入了解飞行…

更安全的ssh协议与Gui图形化界面使用

目录 前言&#xff1a; 一.Gui图形化界面的使用 二.ssh协议 SSH的主要作用包括&#xff1a; 相比其他网络协议&#xff0c;SSH的优势包括&#xff1a; 三.idea集成Git 前言&#xff1a; 上一篇讲解了git的命令用法以及https协议&#xff0c;但是这个协议放在做团队项目的…

STM32-HAL库09-CAN通讯(loopback模式)

一、所用材料&#xff1a; STM32F103C6T6最小系统板 STM32CUBEMX&#xff08;HAL库软件&#xff09; MDK5 串口调试助手 二、所学内容&#xff1a; 初步学习如何使用STM32的CAN通讯功能&#xff0c;在本章节主要达到板内CAN通讯的效果&#xff0c;即32发送CAN信息再在CAN接收…

初识Linux:目录路径

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 一、基本指令&#xff1a; 二、文件 文件内容文件属性 三、ls 指令拓展 1、 ls -l &#xff1a; 2、ls -la&#xff1a; 3、ls [目录名] &#xff1a; 4、ls -ld [目录名]&#xff1a; 四、Linux中的文件和…