IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【Linux】网络编程之服务器与客户端的数据交互 -> 正文阅读

[系统运维]【Linux】网络编程之服务器与客户端的数据交互

前言参考

————————————————
版权声明:本文为CSDN博主「蓝精灵喜欢格格巫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dive668/article/details/119202871
————————————————

本博文基于作者上一篇博文(Linux网络编程基础知识),主要用于完善作业,代码改动其实很小。

argc !=2是什么意思

What does argc mean? [duplicate]

argc是参数的数量,并且argv是一个字符串数组。
程序本身是第一个参数argv[0],因此argc总是至少为 1。
那么,argc是2当程序使用一个命令行参数运行。如果它不带参数运行,或者超过一个参数,argc != 2则为真,因此将打印使用消息“Usage: display_image ImageToLoadAndDisplay”,告诉用户如何正确运行它。

inet pton函数

inet_pton()和inet_ntop()函数详解

对stdin,stdout 和STDOUT_FILENO,STDIN_FILENO的学习

对stdin,stdout 和STDOUT_FILENO,STDIN_FILENO的学习

Linux网络编程基础知识

【Linux】网络编程基础知识

Linux下C语言编程

1.首先我们通过如下命令创建一个名为count.c的文件,并在vim编辑器内,向其中写入C语言程序。

vim count.c

2.用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令:

gcc -o count count.c

3.执行count.c

./count

即可运行count

实例:linux下运行hello world

  • 创建hello world.c
vim hello_world.c
  • 写入代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	printf("hello world for linux!\n");
	return 0;
}

  • 执行编译
gcc -o hello hello_world.c
  • 提示没有找到gcc,请install gcc,通过如下指令install gcc
sudo apt-get update
sudo apt install gcc
  • 之后执行编译指令,并通过ls-l查看效果

在这里插入图片描述

  • 执行hello
./hello

成功运行
在这里插入图片描述

实验内容和要求

实现以下程序

1.服务器端存放共享变量var_temp,该值从终端(键盘)中输入。
2.多个客户端(数量大于3)不断向服务器端发送数据请求(固定内容"get current var_temp") (ps:此处涉及到并发控制)
3.服务器点接收到客户端请求("get current var_temp")后,将var_temp的值减1后发给请求的客户端 (ps:此处是服务器端数据处理并返回)
4.客户端收到服务器端的数据后输出到终端上(printf输出)
5.当服务器端的var_temp值为0,向请求的客户端发送 "over"
6.客户端收到"over"后,退出。

要求:

用C语言编写客户端和服务器端应用程序,输出结果截屏保存到实验报告中。
作业除了提交word版本、PDF版本的报告以外,还需要提交可编译执行的源代码。

完整代码

客户端

/*
 * @Description: 
 * @Author: dive668
 * @Date: 2021-07-29 09:22:52
 * @LastEditTime: 2021-07-29 10:35:38
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
''' 
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
'''
#define MAXLINE 80
#define SERV_PROT 6666
int main(void)
{
    struct sockaddr_in servaddr,cliaddr; //定义通信进程的地址
    socklen_t cliaddr_len; //定义addr的长度
    int listenfd,connfd; //创建两个socket的文件描述符
    char buf[MAXLINE]; 
    char str[INET_ADDRSERLEN];
    int i,n;
    listenfd=socket(AF_INET,SOCK_STEAM,0); 
    //用于打开网络通讯端口,调用成功则返回一个文件描述符,调用失败则返回-1
    bzero(&servaddr,sizeof(servaddr)); //结构体清零
    servaddr.sin_family=AF_INET; //设置地址类型为AF_INET
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY); //设置?络地址为INADDR_ANY
    servaddr.sin_port=htons(SERV_PROT); //设置端口号为宏定义的端口6666
    bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); //将socket文件与进程绑定
    listen(listenfd,20); //设置服务器可建立连接的数量为20
    printf("Accepting connections...\n");
    while(1)
    {
        cliaddr_len=sizeof(cliaddr);
        connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len); //处理客户端连接请求
        n=recv(connfd,buf,MAXLINE,0); //从已连接的套接字中接收信息,若调用成功则返回读到的字节数
        printf("received from %s at PORT %d\n",inet_stop(AF_INET,&cliaddr.sin_addr,str,sizeof(stderr),ntohs(cliaddr.sin_port));
        for(i=0;i<n;++i)
            if(buf[i]!='0')
                buf[i]=buf[i]-1; //处理缓冲区的数据
            else
                {
                    buf="error";
                    break;
                }
        send(connfd,buf,n,0); 
        //向处于连接状态的套接字中发送数据
        //connfd为接收端的socket?件描述符
        //buf为要发送的缓冲区中的数据长度
        //flag表示调用的执行方式,设为0则可用write代替send函数
        close(connfd);//关闭连接
    }
    return 0;
}

服务器端

/*
 * @Description: 
 * @Author: dive668
 * @Date: 2021-07-29 09:22:52
 * @LastEditTime: 2021-07-29 10:35:38
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
''' 
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
'''
#define MAXLINE 80
#define SERV_PROT 6666
int main(void)
{
    struct sockaddr_in servaddr,cliaddr; //定义通信进程的地址
    socklen_t cliaddr_len; //定义addr的长度
    int listenfd,connfd; //创建两个socket的文件描述符
    char buf[MAXLINE]; 
    char str[INET_ADDRSERLEN];
    int i,n;
    listenfd=socket(AF_INET,SOCK_STEAM,0); 
    //用于打开网络通讯端口,调用成功则返回一个文件描述符,调用失败则返回-1
    bzero(&servaddr,sizeof(servaddr)); //结构体清零
    servaddr.sin_family=AF_INET; //设置地址类型为AF_INET
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY); //设置?络地址为INADDR_ANY
    servaddr.sin_port=htons(SERV_PROT); //设置端口号为宏定义的端口6666
    bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)); //将socket文件与进程绑定
    listen(listenfd,20); //设置服务器可建立连接的数量为20
    printf("Accepting connections...\n");
    while(1)
    {
        cliaddr_len=sizeof(cliaddr);
        connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len); //处理客户端连接请求
        n=recv(connfd,buf,MAXLINE,0); //从已连接的套接字中接收信息,若调用成功则返回读到的字节数
        printf("received from %s at PORT %d\n",inet_stop(AF_INET,&cliaddr.sin_addr,str,sizeof(stderr),ntohs(cliaddr.sin_port));
        for(i=0;i<n;++i)
            if(buf[i]!='0')
                buf[i]=buf[i]-1; //处理缓冲区的数据
            else
                {
                    buf="error";
                    break;
                }
        send(connfd,buf,n,0); 
        //向处于连接状态的套接字中发送数据
        //connfd为接收端的socket?件描述符
        //buf为要发送的缓冲区中的数据长度
        //flag表示调用的执行方式,设为0则可用write代替send函数
        close(connfd);//关闭连接
    }
    return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 22:48:38  更:2021-07-30 22:48:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:49:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计