0%

国网项目服务器设计

本次博客用于记录协作开发基于socket传图过程中所学内容。

客户端代码

代码框架

接收回调 菜单

创建线程

零拷贝机制

字节序

大小端字节序/结构体对齐/gdb调试

socket

fsync刷新缓冲区 read阻塞

文件描述符

C语言读写文件

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
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE* fp = fopen("./log.txt", "w");
if(fp == NULL){
perror("fopen failed ! \n");
return -1;
}

// int cnt = 10;
// while(cnt --){
// const char * msg = "hello file ! \n";
// fputs(msg, fp);
// }
fprintf(fp, "FILE pointer write pattern ! This is a test file . \n");
fclose(fp);

FILE* fp_read = fopen("./log.txt", "r");
if(fp_read == NULL) {
perror("fopen read failed ! \n");
return -1;
}
char buffer[1024];
while(fgets(buffer, sizeof(buffer), fp_read)){
printf("%s \n", buffer);
}
// if(feof(fp_read)){
// printf("fgets quit normal! \n");
// }
// else{
// printf("fgets quit not normal ! \n");
// }
fclose(fp_read);
return 0;

}

Cpp读取文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ofstream out("./log.txt", std::ios::out|std::ios::binary);
if(!out.is_open()){
std::cerr << "open failed ! \n" << std::endl;
return -1;
}
std::string msg = "Hello, this is cpp file descriptor ! \n";
int cnt = 10;

while(cnt --){
/* 函数原型 const char* c_str();
由于c语言没有string类型 使用c_str()将string转化为const char*
*/
out.write(msg.c_str(), msg.size());
}
out.close();
return 0;

}

校验 MD5 CRC

调试

git

  • 合作开发:先git pull 再 git push
  • 在gitignore文件中写*png此时远程仓库若没有任何png文件,中再次上传时会自动忽略
  • git pull遇到conflict 自动合并出现问题需要手动解决冲突,再次add后commit即可pull

磁盘损坏

粘包

gdb生成调试core文件

服务器代码

代码框架

函数原型

在 C 语言中,nanosleep 函数定义在 <time.h> 头文件中,其原型如下:

1
2
3
#include <time.h>

int nanosleep(const struct timespec *reqtp, struct timespec *remtp);

参数

  • **reqtp**:指向 timespec 结构的指针,该结构指定了要延迟的时间。timespec 结构包含两个成员:tv_sec(秒数)和 tv_nsec(纳秒数)。
  • **remtp**:指向 timespec 结构的指针,如果函数被信号中断,该结构将被用来存储未休眠的时间。

返回值

  • 如果函数成功执行,nanosleep 返回 0
  • 如果函数被信号中断,返回一个错误,并将剩余的睡眠时间存储在 remtp 指向的 timespec 结构中。