meowrain

MeowRain

Life is Simple

Websocket服务端 Golang

服务端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 package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader websocket.Upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func socketHandler(w http.

Golang实现文件断点续传

Golang实现文件断点续传 HTTP 范围请求 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Range_requests https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Range https://juejin.cn/post/7381455296658751551?searchId=202406222022394BE0D5BA1F1DB137CFF5 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/206 我们首先用golang写一个不具备范围请求的代码 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 package main import ( "mime" "net/http" "os" "path/filepath" "strconv" "github.

Go Net/Http库

Go net/http库 Get()方法 函数原型 1 func Get(url string) (resp *Response, err error) 使用示例: 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 package main import ( "fmt" "io" "log" "net/http" ) func main() { response, err := http.Get("http://httpbin.org/get") if err != nil { log.Fatal(err) } fmt.

Linux系统编程 标准IO 打开并读写文件

https://cplusplus.com/reference/cstdio/fopen/ https://cplusplus.com/reference/cstdio/fgetc/?kw=fgetc https://cplusplus.com/reference/cstdio/fputc/?kw=fputc https://cplusplus.com/reference/cstdio/fgets/?kw=fgets https://cplusplus.com/reference/cstdio/fputs/?kw=fputs https://man7.org/linux/man-pages/man3/getline.3.html https://cplusplus.com/reference/cstdio/feof/?kw=feof https://cplusplus.com/reference/cstdio/fclose/?kw=fclose https://cplusplus.com/reference/cstdio/fread/?kw=fread https://cplusplus.com/reference/cstdio/fwrite/?kw=fwrite https://cplusplus.com/reference/cstdio/fseek/?kw=fseek https://cplusplus.com/reference/cstdio/rewind/kw=rewind https://cplusplus.com/reference/cstdio/ftell/?kw=ftell fopen: 函数原型:FILE *fopen(const char *filename, const char *mode); 功能:打开一个文件,并返回一个指向该文件的文件指针(FILE 类型)。这个文件指针用于后续的文件读写操作。 参数: filename:指向一个以空字符结尾的字符串,该字符串指定要打开的文件名,可以包含路径信息。 mode:指向一个以空字符结尾的字符串,指定文件的打开模式。常见的模式包括: "r":以只读方式打开文件(文件必须存在)。 "w":以写入方式打开文件,如果文件不存在则创建,如果文件已存在则清空文件内容。 "a":以追加方式打开文件,如果文件不存在则创建,写入的数据追加到文件末尾。 "r+":以读写方式打开文件(文件必须存在)。 "w+":以读写方式打开文件,如果文件不存在则创建,如果文件已存在则清空文件内容。 "a+":以读取和追加方式打开文件,如果文件不存在则创建,读取从文件开始,写入追加到文件末尾。 还可以在上述模式后添加 "b" 来以二进制模式打开文件,例如 "rb"、"wb" 等。 返回值:成功时返回一个有效的文件指针,如果文件无法打开,则返回 NULL。 在使用 fopen 打开文件后,通常需要检查返回的文件指针是否为 NULL 来确保文件成功打开。文件使用完毕后,应使用 fclose 函数关闭文件,释放资源。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 FILE *fp; char *filename = "example.txt"; char *mode = "r"; fp = fopen(filename, mode); if (fp == NULL) { printf("无法打开文件\n"); return 1; } // 文件操作代码.

Linux系统编程-文件IO-缓冲区实例

行缓冲 在使用行缓冲的情况下,每当输入输出遇到换行或者缓冲区满了的情况下才会进行实际的IO操作,当涉及到终端输入输出的时候通常使用行缓冲。 当字符数超过1024个时,进行IO操作 使用换行符时候进行IO 全缓冲 在使用全缓冲的情况下,当数据填满整个缓冲区之后才进行实际的IO操作。对于驻留在磁盘上的文件的读写通常是使用全缓冲。通常如果不给文件流指定缓冲区的情况下,标准IO函数会首先调用malloc函数获取所需要的缓冲区。

Tinyhttpd源码解析

参考文档 https://jacktang816.github.io/post/tinyhttpdread/ 执行过程 HTTP HTTP请求头 当然,下面是一个带有 \r\n 行结尾的 HTTP 请求头示例: 1 2 3 4 5 6 7 8 9 GET /index.html HTTP/1.1\r\n Host: www.example.com\r\n User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n Accept-Language: en-US,en;q=0.5\r\n Accept-Encoding: gzip, deflate\r\n Connection: keep-alive\r\n Upgrade-Insecure-Requests: 1\r\n \r\n 解释 每一行都是一个 HTTP 头字段,使用 \r\n(回车符和换行符)来表示行结束。 最后一行的 \r\n 表示头部结束,之后的内容(如果有)是请求的主体。 分解示例 请求行: 1 GET /index.html HTTP/1.1\r\n GET 是 HTTP 方法。 /index.html 是请求的路径。 HTTP/1.1 是 HTTP 版本。 头字段:

C Intptr_t类型

intptr_t 是一种在 C 和 C++ 标准库中定义的整数类型。它是专门设计用来存储指针的整数类型,确保能够存储任何指针的整数值。这个类型定义在 <stdint.h> 头文件中。 详细解释 定义: intptr_t 是一个有符号整数类型,能够存储任何指针转换成的整数值。 对应的无符号类型是 uintptr_t。 用途: 通常用于需要将指针值存储为整数或者从整数恢复指针值的场景。 在进行指针与整数之间的转换时,使用 intptr_t 可以确保程序的可移植性和类型的安全性。 头文件: 在 C 中:#include <stdint.h> 在 C++ 中:#include <cstdint> 示例 下面是一个简单的示例,展示如何使用 intptr_t 类型: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> #include <stdint.h> int main() { int a = 42; int *p = &a; // 将指针转换为整数 intptr_t int_value = (intptr_t)p; printf("Pointer as integer: %ld\n", (long)int_value); // 将整数转换回指针 int *new_p = (int *)int_value; printf("Value through new pointer: %d\n", *new_p); return 0; } 解释 int a = 42; 定义一个整数变量 a。 int *p = &a; 定义一个指针 p,指向变量 a。 (intptr_t)p 将指针 p 转换为整数类型 intptr_t。 printf("Pointer as integer: %ld\n", (long)int_value); 输出指针转换后的整数值。 (int *)int_value 将整数值 int_value 转换回指针类型。 printf("Value through new pointer: %d\n", *new_p); 输出通过新指针 new_p 访问的值。 使用 intptr_t 和 uintptr_t 可以确保指针和整数之间的转换在不同平台上都是安全和可移植的。

C Stat函数使用

C stat函数使用 头文件:#include<sys/stat.h> #include<uninstd.h> 定义函数:int stat(const char * file_name, struct stat *buf); 函数说明:stat()用来将参数file_name 所指的文件状态, 复制到参数buf 所指的结构中。 struct stat *buf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 struct stat { dev_t st_dev; //device 文件的设备编号 ino_t st_ino; //inode 文件的i-node mode_t st_mode; //protection 文件的类型和存取的权限 nlink_t st_nlink; //number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1. uid_t st_uid; //user ID of owner 文件所有者的用户识别码 gid_t st_gid; //group ID of owner 文件所有者的组识别码 dev_t st_rdev; //device type 若此文件为装置设备文件, 则为其设备编号 off_t st_size; //total size, in bytes 文件大小, 以字节计算 unsigned long st_blksize; //blocksize for filesystem I/O 文件系统的I/O 缓冲区大小.

Linux C网络编程

转换ip inet_pton() inet_pton 函数用于将字符串表示的 IP 地址转换为网络字节序的二进制格式。与 inet_ntop 相反,inet_pton 的用途是从人类可读的字符串格式转换到机器可读的二进制格式。 函数原型 1 2 3 #include <arpa/inet.h> int inet_pton(int af, const char *src, void *dst); 参数 af:地址家族,可以是 AF_INET(表示 IPv4)或 AF_INET6(表示 IPv6)。 src:指向以字符串形式表示的地址(如 "192.168.1.1" 或 "2001:db8::1")。 dst:指向存储转换后地址的缓冲区。 返回值 成功时返回 1。 如果输入的字符串不是有效的网络地址,返回 0。 失败时返回 -1,并设置 errno 来指示错误。 使用示例 以下是使用 inet_pton 的示例,展示如何将 IPv4 和 IPv6 地址从字符串格式转换为二进制格式: 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 #include <stdio.

计算机网络基础知识

基础知识 MAC 地址 (1)计算机联网必须的硬件是安装在计算机上的网卡 (2)通信中,用来标识主机身份的地址就是制作在网卡上的一个硬件地址。每块网卡在 生产出来后,都有一个全球唯一的编号来标识自己,这个地址就是 MAC 地址,即网卡的 物理地址 (3)MAC 地址由 48 位二进制数组成,通常分成六段,用 16 进制表示,其中前 24 位是生 产厂商向 IEEE 申请的厂商编号,后 24 位是网络接口卡序列号 (4)MAC 地址的第 8 位为 0 时,表示该 MAC 地址为单播地址;为 1 时,表示该 MAC 地址 为组播 MAC 地址。 (5)单播的发送方式为一对一,即一台主机发送的数据只发送给另一台主机。 (6)广播方式为一对多,即一台主机发送一个数据,在这个网段的所有主机都能收到 (7)组播方式介于单播和广播之间,也是一对多,但接收者不是网段上的全体成员,而 是一个特定的组的成员。 以太网帧格式: IP IP 在 TCP/IP 参考模型中处于第三层,也就是网络层。 网络层的主要作用是:实现主机与主机之间的通信,也叫点对点(end to end)通信。 IP 包格式 IP 地址的基础知识 IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。 人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「.」隔开,再将每组转换成十进制。 IP 地址分类 A 类: 0.
0%