Linux 网络编程

Linux基础之网络编程 1)进程间通信的方式有**:管道,消息队列,共享内存,信号,信号量这么集中2)特点:依赖于linux内核,基本是通过内核来实现应用层的两个进程间的通信3)缺陷:无法多机通讯1)网络编程适用去不同的pc间的通信,可以实现多机运行地址和数据地址是指:IP地址和端口号。每台PC机连网够都有一个IP地址,那么每台联网的PC机可能跑多个服务器,然后每个服务器中对应的有很多进程。当客户端接入的时候,不知道去对接哪个服务器。那么这时端口号对应的就是每个服务器的端口。客户就可以通过端口号连接到对应的服务器了。 阅读详情

引入:


进程间的通信 - 特点: 依赖 Linux内核. --> 缺陷: 无法多机通信

多机通信 -- 比如 Android IOS Linux之间的通信组合

网络编程:

1.地址: 
  a.IP地址
  b.端口号

2.数据:

需要协议传输协议(数据格式)(TCP UDP HTTP) ,其他协议,such as: C51的串口协议

socket 套接字:


TCP: 面向连接: 打电话 -- 适用精细操作

UDP:    面向报文: (无连接)发数据 -- 适用大量数据,且不要求精细

TCP 和 UDP 对比 :


1.TCP面向连接(比如,打电话,需要先输入号码建立连接)
   UDP无需连接
2.TCP提供可靠服务 -- 通过TCP传输的数据,无差错,不丢失,不重复,且程序可达
   UDP尽最大可能交付,但不保证交付
3.TCP面向字节流,实际上是TCP把数据看成一串无结果的字节流
   UDP面向报文,UDP没有拥塞控制,so网络出现拥塞不会使得元主机发送速率降低(对实时应用很有用,IP电话,实时视频会议等)
4.连接上: TCP: 一对一,点到点
               UDP:一对一,一对多,多对一,多对多的交互通信
5.TCP首部开销大,   20字节
   UDP首部开销小,  8字节
6.逻辑通信信道上,TCP: 双全工   
                               UDP:不可靠信道

端口号的作用:


拥有IP的主机会提供一系列的服务,通过" IP地址+ 端口号"来区分不同的服务
端口提供了一种访问通道

服务器一般都是通过知名的端口号来识别。
比如: FTP服务器-TCP21  Telnet-TCP23  TFTP-UDP69
=====================================================


字节序

概念:
字节序 -- 多字节数据在 计算机内存中存储 或者 网络传输时 各字节的存储顺序

常见序:
小端字节序-LE:低序字节存储在起始地址
大端字节序-BE:  高序字节存储在起始地址
 
比如:  0x 01 02 03 04
内存地址从低字节算起, 就是从04 算起,04 - 4001 03-4002 02-4003 01-4004

LE(Little Endian) : 04 03 02 01
BE(Big Endian):   01 02 03 04

网络字节序 -- 大端字节序

Scoket 网络编程步骤:


TCP Server
服务器开发步骤:
socket() --> bind() --> listen() --> accept()  --> read() write() --> close()
1. 创建套接字 --socket
2.为套接字添加信息(IP 和 端口号) - bind
3. 监听网络连接   -->listen()
4.有客户端接入接受一个链接 - accept
5.数据交互 - read() write()
6.关闭套接字,断开连接 close()

TCP Client:

scoket() --> connect() --> write(),read() --> close()


====================================================


Linux 网络编程 API

服务器


1.创建套接字socket: 

头文件
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

函数原型

       int socket(int domain, int type, int protocol);

参数介绍: 


domain - 协议族:  AF_INET IPv4,  af_INET6  IPv6  - 因特网域  AF_UNIX -Unix域、

type-- 指定类型: 
 SOCK_STREAM  -- TCP-- 字节流的形式
 SOCK_DGRAM -- UDP -- 报文的形式

protocol  --协议: 
0 -- 选择 type指定类型的吗,默认协议
IPPROTO_TCP
IPPROTO_UDP

IPPROTO_SCTP
IPPROTO_TIPC


2.准备地址(IP + 端口号) bind:

头文件

      #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

函数原型

       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

参数:
sockfd -- socket 描述符
addr -- 结构体指针-- 结构体里面包含了需要的 IP  和 端口号 协议族
addrlen -- 结构体的大小

addr 的 结构体原型:

struct sockaddr_in{
sa_family_t sin_family; //地址族(Address Family),也就是地址类型
uint16_t sin_port; //16位的端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //不使用,一般用0填充
};

------------------------


地址 转换API:
 

头文件

      #include <sys/socket.h>
       #include <netinet/in.h>
       #include <arpa/inet.h>

函数原型

       int inet_aton(const char *cp, struct in_addr *inp);
     //将字符串形式的ip地址(102.168.88.5)转换为网络能识别的格式

    //  a -- ASCLL     to -- 就是to转换为的意思  n -- net  网络形式
 
         char *inet_ntoa(struct in_addr in);
    // 把网络格式的ip地址转为字符串形式的ip地址

3.监听:listen 

函数原型:
               int listen(int sockfd, int backlog);

参数:
 sockfd -- socket描述符
 backlog -- 最大连接数


4.连接accept:

函数原型
   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:
 sockfd -- socket描述符
 addr --- 客户端地址
 addrlen); --  客户端地址长度


5. 数据收发:

用到API
      read() write()   send() recv()


客户端连接主机:

注:由于客户端的其他方面步骤使用的API 和服务器都一样,我们在这就不重复了,请看上面服务器API的部分去了解,我们这里只介绍客户端独有的  connect()

connect()
 

函数原型

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

参数:
*addr -- 服务器ip和端口号的指针
addrlen -- 什么的纠结体的大小
-------------------------------------------------------

 查看库的指令补充
 在 /usr/include/ 下去查找文件的时候
可使用 grep "test" * -nir  
-n 找到返回行号
-i 不区分大小写
-r递归寻找


//低于3000 的端口是操作系统使用,我们使用5000即可
我们Linux固定的ip:192.168.88.130(根据自己的ip地址修改)

怎么查看自己的ip地址  -- linux 指令  ifconfig




实例


case1: 实现基本的服务器:


#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<stdlib.h>

int main()
{
    int s_fd; // 来接收套接字描述符
//1. socket -- IPv4  流形式i 0 --默认 TCP 
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){ // 返回值为-1 表示创建失败
    perror("socket");
    exit(-1);
}
// 初始化bind需要的struct
struct sockaddr_in s_addr;
s_addr.sin_family=AF_INET; // 指定协议族为IPV4
// htons -- h - host to  ns-net short
s_addr.sin_port=htons(8989);// 指定端口号
// a -- ASCLL 
inet_aton("192.168.88.130",&s_addr.sin_addr); // 指定ip地址,注意第二个参数格式,把ip地址放到第二个参数 sin_arr里面

//3.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in ));// bind - 建立连接 准备
// listen
listen(s_fd,10); // listen 阻塞程序,等待连接  指定最大链接数为10
//4.accept
int c_fd=accept(s_fd,NULL,NULL); // 获得新的客户端 描述符

puts("connect.");
while(1);

    return 0;
}

============================================


case2 -- read write 实现读取输入信息

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>


int main()
{
    int s_fd;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr; // 创建两个结构体,自发自收

    int nread;
    char *msg="I get your connect";
    char readBuf[128];
    memset(&s_addr,0,sizeof(struct sockaddr_in));
    memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen=sizeof(struct sockaddr_in);
//1. socket -- IPv4  流形式i 0 --默认 TCP 
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1){
    perror("socket");
    exit(-1);
}
// 初始化bind需要的struct

s_addr.sin_family=AF_INET;
// htons -- h - host to  ns-net short
s_addr.sin_port=htons(8988);
// a -- ASCLL 
inet_aton("192.168.88.130",&s_addr.sin_addr);

//3.bind
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in ));
// listen
listen(s_fd,10);
//4.accept  s_addr 发到 c_addr 里面
int c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&clen); // 获得新的客户端 描述符
if(c_fd == -1){
perror("accept");
}

printf("get connect. %s\n",inet_ntoa(c_addr.sin_addr));

//read()
nread=read(c_fd,readBuf,128);
if(nread ==-1){
perror("read");
}
else {
printf("get message : %d ,%s\n",nread,readBuf);
}

// write
write(c_fd,msg,strlen(msg));

    return 0;
}
 

=============================


case3 : 编写代码实现客户端:

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
//#include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>


int main()
{
    int c_fd;
    struct sockaddr_in c_addr;
    int nread;
    char *msg="messeage from client";
    char readBuf[128];

    memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen=sizeof(struct sockaddr_in);
//1. socket -- IPv4  流形式i 0 --默认 TCP 
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1){
    perror("socket");
    exit(-1);
}
// 初始化connect连接需要的struct

c_addr.sin_family=AF_INET;
// htons -- h - host to  ns-net short
c_addr.sin_port=htons(8988);
// a -- ASCLL 
inet_aton("192.168.88.130",&c_addr.sin_addr);

//2.connect -- 阻塞等待连接
int p_c=connect(c_fd,(struct sockaddr *)&c_addr,sizeof( struct sockaddr_in));
if(p_c==-1){
perror("connect");
exit(-1);
}

if(c_fd == -1){
perror("accept");
}

printf("get connect. %s\n",inet_ntoa(c_addr.sin_addr));

// write -- send 
write(c_fd,msg,strlen(msg));

//read()
nread=read(c_fd,readBuf,128);
if(nread ==-1){
perror("read");
}
else {
printf("get message from server: %d ,%s\n",nread,readBuf);
}

    return 0;
}

===================================

case4: 双人聊天室

服务器

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
// #include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int s_fd;
    int c_fd;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int nread;
    char msg[128]={0};
    char readBuf[128]={0};
    if(argc != 3){// 判断传参是否正确
    puts("Improper parameters");
    exit(-1);
    }
    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化bind需要的struct

    s_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    s_addr.sin_port = htons(atoi(argv[2])); // 通过传参指定端口
    // a -- ASCLL  传参方式得到IP
    inet_aton(argv[1], &s_addr.sin_addr);

    // 3.bind
    bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
    // listen
    listen(s_fd, 10);
    // 4.accept
    while (1)//保持一直接收,支持多个客户端的接入
    {
        c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen); // 获得新的客户端 描述符
        if (c_fd == -1)
        {
            perror("accept");
        }

        printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

        if (fork() == 0)
        { //  创建子进程来处理读写

            if (fork() == 0)
            {             // 创建一个子进程负责发送数据
                while (1) // 我们希望能一直接发
                {
                    memset(msg, 0, sizeof(msg));
                    printf("input:");
                    gets(msg); // //获取键盘数据,存入msg
                    write(c_fd, msg, strlen(msg));
                }
            }
            while (1)
            {
                // read()
                memset(readBuf,0,sizeof(readBuf));
                nread = read(c_fd, readBuf, 128);
                if (nread == -1)
                {
                    perror("read");
                }
                else
                {
                    printf("get message : %d ,%s\n", nread, readBuf);
                }
            }
        }
    }
    return 0;
}


客户端
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
// #include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int c_fd;
    struct sockaddr_in c_addr;
    int nread;
    if(argc != 3){// 判断传参是否正确
    puts("Improper parameters");
    exit(-1);
    }
    char msg[128] = {0};
    char readBuf[128];

    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    c_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (c_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化connect 需要的struct

    c_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    c_addr.sin_port = htons(atoi(argv[2]));
    // a -- ASCLL
    inet_aton(argv[1], &c_addr.sin_addr);

    // 2.connect -- 阻塞等待连接
    int p_c = connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr_in));
    if (p_c == -1)
    {
        perror("connect");
        exit(-1);
    }

    if (c_fd == -1)
    {
        perror("accept");
    }

    printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

    while (1)
    { // 我们希望能一直读写 -- 实现聊天功能
        // write -- send
        if (fork() == 0)
        { // 创建一个子进程负责发送数据
            while (1) //我们希望能一直接发
            {
                memset(msg, 0, sizeof(msg));
                printf("input:");
                gets(msg); // //获取键盘数据,存入msg
                write(c_fd, msg, strlen(msg));
            }
        }
        while (1)//我们希望能一直接发
        {
            // read()
            memset(readBuf,0,sizeof(readBuf));
            nread = read(c_fd, readBuf, 128);
            if (nread == -1)
            {
                perror("read");
            }
            else
            {
                printf("get message from server: %d ,%s\n", nread, readBuf);
            }
        }
    }

    return 0;
}

=========================================


case5 : 实现多方消息接收:加个标志确定不同的客户端

每次连接到一个新的客户端mark就 + 1

// 通过mark 标记客户端是序号

#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
// #include<linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int s_fd;
    int c_fd;
    int mark=0;
    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;
    int nread;
    char msg[128]={0};
    char readBuf[128]={0};
    if(argc != 3){// 判断传参是否正确
    puts("Improper parameters");
    exit(-1);
    }
    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    int clen = sizeof(struct sockaddr_in);
    // 1. socket -- IPv4  流形式i 0 --默认 TCP
    s_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (s_fd == -1)
    {
        perror("socket");
        exit(-1);
    }
    // 初始化bind需要的struct

    s_addr.sin_family = AF_INET;
    // htons -- h - host to  ns-net short
    s_addr.sin_port = htons(atoi(argv[2])); // 通过传参指定端口
    // a -- ASCLL  传参方式得到IP
    inet_aton(argv[1], &s_addr.sin_addr);

    // 3.bind
    bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));
    // listen
    listen(s_fd, 10);
    // 4.accept
    while (1)
    {
        c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen); // 获得新的客户端 描述符
        if (c_fd == -1)
        {
            perror("accept");
        }
        mark++;// 每次连接到一个新的客户端mark就 + 1

        printf("get connect. %s\n", inet_ntoa(c_addr.sin_addr));

        if (fork() == 0)
        { //  创建子进程来处理读写

            if (fork() == 0)
            {             // 创建一个子进程负责发送数据
                while (1) // 我们希望能一直接发
                {
                    memset(msg, 0, sizeof(msg));
                    sprintf(msg,"welcome NO.%d client",mark);
                    write(c_fd, msg, strlen(msg));
                    sleep(5);
                }
            }
            while (1)
            {
                // read()
                memset(readBuf,0,sizeof(readBuf));
                nread = read(c_fd, readBuf, 128);
                if (nread == -1)
                {
                    perror("read");
                }
                else
                {
                    printf("get message : %d ,%s\n", nread, readBuf);
                }
            }
        }
    }
    return 0;
}

===============================================================

后话


 为了解决不能多个窗口交流的问题,我们决定实现以下项目:

先提供思路和介绍,我们将=在下篇实现这个项目


实现ftp 服务器 客户端:
项目思路:

功能:

客户端:
1.获取服务器的文件  get xx
2.展示服务器的文件 ls
3.进入服务器的某个文件夹  cd 
4.上传文件到服务器   put


本地: 
1.ls  -- 查看本地文件
2.lcd 进入客户端 某某文件夹

详情了解请跳转:Linux 网络编程项目--简易ftp-优快云博客

STM32使用LORA模块通信 目录 一、模块使用方法 1、模块简介 2、硬件及功能 3、传输方式 二、模块上手 1、连接 2、编写代码 usart3.h usart3.c lora.h lora.c 一、模块使用方法 本文以正点原子ATK-LORA-01模块为例进行介绍。 1、模块简介 ATK-LORA-01-V3.0(V3.0是版本号,下面均以ATK-LORA-01表示该产品)是ALIENTEK推出的一款体积小、微功率、低功耗、高性能远距离LORA无线串口模块。模块设计是采用高效的IS... 阅读详情

相关推荐

STM32H743必要外围电路分析

写在前面:这篇博客是我第一次绘制STM32最小系统板的过程记录。 2020-1-11 BOOT STM32采用ARM内核,和ARM处理器一样,都有专门的boot脚决定单片机从何处启动。 在官方数据手册的第105页,我们可以看到 系统复位后,在SYSTICK的第四个上升沿锁存BOOT引脚的值,复位后,BOOT引脚可以由用户自由配置而不会影响系统正常运行。 BOOT引脚决定了自举存储器地址,当BO...

Cui_Hongwei的博客 1万+

Linux网络编程

socket()函数用于创建一个新的套接字,并返回套接字的文件描述符。如果套接字创建失败,函数将返回-1。

cyz322649的博客 1358

CoppeliaSim远程API实战:用Python控制仿真机器人,5步搞定外部通信

本文详细介绍了如何使用Python通过CoppeliaSim远程API控制仿真机器人,实现外部通信的5个关键步骤。从环境配置到双向通信模式,再到实战案例和性能优化技巧,帮助开发者高效连接算法开发与物理验证。特别对比了B0与传统API的性能差异,提升工业自动化项目的开发效率。

weixin_28733637的博客 367

linux 网络编程

linux系统编程-网络编程

qq_39855356的博客 5556

MATLAB图像去噪实战:如何用巴特沃斯滤波器完美去除横条纹(附完整代码)

本文详细介绍了如何使用MATLAB中的巴特沃斯滤波器有效去除图像中的横条纹噪声。通过频域分析和滤波处理,结合完整的代码示例,帮助读者掌握从噪声分析到参数优化的全流程技术,实现高质量的图像去噪效果。

weixin_30566063的博客 563

【CATIA的二次开发38】对象Selection交互选择部分方法介绍01

在CATIA V5的VBA开发中,Selection对象是用户交互的核心组件,用于管理用户在图形区域或特征树中的选择操作。Selection 对象是 CATIA VBA 中的中央交互枢纽,充当用户界面与程序逻辑之间的桥梁。它代表当前在图形区域或特征树中被选中的元素集合,是自动化操作的基础。

学习共勉:不积跬步,无以至千里; 不积小流,无以成江海。 1342

总结之linux下网络编程

1.有一篇好的文章,对Linux下socket编程的原理和要点说的很清楚: http://blog.youkuaiyun.com/chencheng126/article/details/44260799 2.一些windows网络编程的要点吧。包括大头序,小头序,网络字节序。一些常用的函数等。。 http://blog.youkuaiyun.com/chencheng126/article/detai

Thinking 1万+

2021年J题:基于STM32F103的周期信号波形识别与参数测量系统设计(立创EDA+SZPT_ZXL)

本文详细复盘了2021年全国大学生电子设计竞赛J题获奖项目,手把手教你如何基于STM32F103微控制器设计并实现周期信号波形识别与参数测量系统。文章深入剖析了硬件电路设计(包括程控放大、工作点抬升与滞回比较器)与核心软件算法(如动态采样、FFT频谱分析与波形识别逻辑),并分享了DMA传输、FFT库使用等实战要点与避坑指南,为嵌入式信号处理与电赛备赛提供了宝贵经验。

weixin_32673065的博客 230

Linux系统网络编程

网络系统编程,TCP,UDP,IP

2403_82436914的博客 1352

2026 年 AI 大模型资讯深度研究报告 / 2026 年 3 月 11 日

2026 年已成为 AI 大模型发展的关键拐点年。从 2023 年 ChatGPT 开启的技术奇点,历经多模态突破、推理能力崛起,至 2025 年形成产业爆发态势,AI 大模型正从"技术验证期"迈向"产业落地期"。核心发现技术突破: OpenAI 于 2026 年 3 月 6 日发布 GPT-5.4,首次实现原生计算机操控能力,在 OSWorld 桌面操控测试中以 75% 成功率超越人类 (72.4%),标志着 AI 从"对话工具"向"自主数字员工"的时代跃迁市场格局。

AI天才研究院 786

基于Simulink的加速度计振动分析:单自由度质量-弹簧-阻尼系统

摘要:基于Simulink的加速度计单自由度振动分析 本文研究了加速度计的单自由度(SDOF)质量-弹簧-阻尼系统模型,通过MATLAB/Simulink平台建立了完整的振动分析仿真系统。文章详细阐述了理论建模过程,推导了系统运动微分方程和传递函数,并提供了Simulink模型搭建的具体步骤和MATLAB实现代码。研究通过正弦扫频、随机振动和冲击响应三种典型输入信号,分析了系统的幅频特性、相频特性及时域响应,验证了加速度计的工作机理。仿真结果表明,该方法能有效模拟加速度计在不同激励条件下的动态特性,为传感器

AI的内部世界的博客 163

【Linux 网络编程 】

【Linux 网络编程 】

aoeaoao的博客 1350

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 886

关于linux网络编程的项目,linux网络编程入门

如何学LINUX网络编程?你好,我是【小许爱答题】,很高兴为你解答。Linux网络编程一般用C语言,也用C++语言,因为有些网络编程的库是C++的,所以C/C++编程基础最起码要有;另外基础知识部分就是网络原理要学,还有Linux平台的基本编程技术(socket、文件相关的系统调用)。Linux网络编程基本上是一些编程技巧和代码库的运用以及编程经验的积累,学习到一定程度了可以试着编写一些网络服务器...

weixin_39994461的博客 854

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

windows下网络编程与Linux下网络编程的区别

它允许应用程序或 DLL 指定所需的 Windows 套接字版本,并检索特定 Windows 套接字实现的详细信息。Windows系统:getlasterror()/WSAGetLastError()Linux系统:fcntl() (需要包含头文件<fcntl.h>)​ 阻塞等待客户端的连接请求accept()(阻塞函数)​ 阻塞等待客户端的连接请求accept()(阻塞函数)obj.Receive()或者obj.Send()obj.Receive()或者obj.Send()

AAAA202012的博客 1487

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux网络编程入门

(一)Linux网络编程--网络知识介绍Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一        个地方获取文件的时候,是我们的ftp程序主动同

小生物语 1万+

Linux C++网络编程

Linux C++ 网络编程(二) 前言 在上一节中以拆分的方式学习完 Linux 、C++、网络等知识后,这节会将这三个模块糅合起来,站在项目的基础上再次去学习这三个模块。 Linux 网路编程比较经典的有 Redis、Muduo、TeamTalk等开源项目。本文将以 Muduo 来介绍 网络编程的框架,学习完 Muduo 再去学习其他框架就容易许多了。注意, 文中贴的代码均为核心代码,且注释详细,认真阅读。 Linux C++ 网络编程 (一) Linux C++ 开发环境搭建 下载路径 githu

weixin_42496943的博客 875

Linux网络编程基础

Linux网络编程基础

weixin_57286892的博客 1320

Linux —— 网络编程

当一个进程需要与另一个进程通信时,它需要创建一个Socket套接字来表示自己,并使用目标进程的IP地址和端口号来连接到对应的Socket套接字。你的朋友在收到邮件的小块后,按照编号的顺序将它们重新组装在一起,最终得到完整的邮件。一个进程通过IP地址和TCP或UDP端口号来标识自己,同一台计算机上不同的进程可以使用相同的IP地址但不同的端口号。例如,音频和视频流的传输、在线游戏的实时交互等。TCP就像是一个可靠的邮递员,负责将你发送的数据安全、完整地交付给目标设备,让你可以在互联网上进行可靠的通信。

m0_66317799的博客 478

Linux 入门十一:Linux 网络编程

Linux 网络编程是实现跨主机进程通信的核心技术,基于 TCP/IP 四层模型(网络接口层、网络层、传输层、应用层),通过套接字(Socket)接口实现数据交互。核心要素包括:IP 地址(标识主机)、端口号(区分进程)、套接字(IP + 端口 + 协议)。

嵌入式中手 2489

Linux网络编程【2】

Linux网络编程【2】1.概述 搭建好了linux环境和c/c++开发环境后,终于到了可以写代码的时候了,但是开始写代码之前,必须要比较熟悉下面三点内容: 熟悉c/c++编程语言 熟悉linux系统 熟悉计算机网络(TCP/IP协议等),TCP/IP详解 2.主机字节序和网络字节序 cpu一次能装载4个字节(32位机器),即一个整数,这4个字节在内存中的排列顺序就是字节序问题。 大端字节序:指高

yangqihua2015的博客 560

很全的linux网络编程技巧

注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意。 本文转自:https://www.cnblogs.com/jfyl1573/p/6476607.html 看到好文章想留做自己学习,如有侵权,请及时联系,谢谢。 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考模型及TCP/IP参考模型 1 1.3. TCP协议 3 1.4. UD...

qq_41450569的博客 408
上一篇: 怎么计算结构体的大小
下一篇: Linux 网络编程项目--简易ftp
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值