
C
soulsoul_god
慢一点,当你理解的越多,需要记得就越少。
展开
-
解决无网络环境下getaddrinfo引发的超时问题
问题背景:源码中在调用getaddrinfo时,如果是网络正常的环境下,getaddrinfo返回会很快,但如果无网络,机器就无法进行dns解析,从而导致getaddrinfo返回时间高达1-2分钟以上。解决方案:使用多线程执行getaddrinfo源码如下://add by xdlstruct stu_dns_info{ LPCSTR node; LPCSTR servname; struct addrinfo *hints; struct add原创 2021-09-26 09:10:12 · 2192 阅读 · 0 评论 -
cJSON构造与解析json
参考:http://blog.sina.com.cn/s/blog_a6fb6cc90101ffme.html原创 2021-06-11 14:43:25 · 10024 阅读 · 2 评论 -
portSentry入侵检测工具
1、下载portSentry源码网址:https://sourceforge.net/projects/sentrytools/files/latest/download2、原创 2021-06-09 15:32:57 · 855 阅读 · 1 评论 -
二分查找
有序数据,若无序,需要先排序。非递归:#include <stdio.h>#include <string.h>#include <stdlib.h>void binarySearch(int a[], int value , int low, int high){ while(low <= high) { int mid = (high + low)/2; if(a[mid] == value.原创 2021-04-23 13:40:22 · 139 阅读 · 0 评论 -
顺序查找
#include <stdio.h>#include <string.h>#include <stdlib.h>void sequenceSearch(int a[], int length, int k){ int i = 0; for(i = 0; i < length; ++i) { if(a[i] == k) printf("i:%d\n", i); } retur.原创 2021-04-23 11:22:43 · 122 阅读 · 0 评论 -
快速排序
快速排序原理:选取一个数作为基准数,一般选取第一个数,大于基准数的数据放到基准数的后面,小于基准数的数据放到基准数的前面,第一次排序完成之后,基准数的前面都是小于其的数,后面都是大于其的数。然后将前面、后面的数据分别作为一个新的序列按照这种方式重新排序。比如一段数据:6,1,2,7,9,3,4,5,10,8数据6作为基准数,选取i,j变量,j从后往前查找,找到第一个小于6的数据,这里是5,i从前往后查找,找到第一个大于6的数据,这里是7,将5,7交换位置。6,1,2,5,9,3,4.原创 2021-01-06 18:33:45 · 150 阅读 · 0 评论 -
插入排序
#include <stdio.h>#include <string.h>#include <stdlib.h>void insertSort(int a[5], int length){ int i, j = 0; for(i = 1; i < length; ++i) { int temp = a[i]; for(j = i - 1; j >= 0; --j) { .原创 2021-04-22 17:03:31 · 142 阅读 · 0 评论 -
选择排序
#include <stdio.h>#include <string.h>#include <stdlib.h>void selectionSort(int a[5], int length){ int i, j = 0; int min = 0; for(i = 0; i < length -1 ; ++i) { min = i; for(j = i + 1; j < length.原创 2021-04-22 16:28:48 · 98 阅读 · 0 评论 -
冒泡排序
#include <stdio.h>#include <string.h>#include <stdlib.h>void bubbleSort(int a[5], int length){ int i, j = 0; for(i = 0; i < length - 1; ++i) { //for(j = 0; j < length - 1; ++j) for(j = 0; j < len.原创 2021-04-22 15:55:16 · 98 阅读 · 0 评论 -
C-获取当前时间
#include <stdio.h>#include <time.h>int main(){ time_t nowtime; struct tm* p;; time(&nowtime); p = localtime(&nowtime); char time[30] = ""; sprintf(time, "%04d-%02d-%02d %02d:%02d:%02d", p->tm_year+1900, .原创 2021-01-08 17:04:01 · 544 阅读 · 0 评论 -
获取socket客户端的IP
场景:服务端建立socket后,需要知道是哪些客户端IP在发起请求,可以对请求的客户端进行限制等操作。/*获取客户端的IP*/#define NIPQUAD(addr) \((unsigned char *)&addr)[0], \((unsigned char *)&addr)[1], \((unsigned char *)&addr)[2], \((unsigned char *)&addr)[3]client_sockfd = accept(serv原创 2021-01-08 17:00:09 · 2891 阅读 · 0 评论 -
C语言-日志打印
#include <stdio.h>#include <string.h>#include <time.h>#include <stdarg.h>#define MINLEN 128#define RET_ERROR 0const char LOGFILEDIR[MINLEN] = "/tmp/tmp";/**************************************************************** * *.原创 2021-01-08 10:54:54 · 1655 阅读 · 0 评论 -
tcp socket
//server.c#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>#define PORT 4321#define MAX_QUE_CONN_NM 5#define MAXLEN 1024#define RET_OK.原创 2021-01-07 18:33:41 · 195 阅读 · 1 评论 -
socket connect超时设置
场景:客户端调用接口时,默认调用的超时时间会很长,可以通过设置发送的超时时间来控制。int create_server_socket(const char *node_ip, int port){ int sockfd; int sendbytes; char buf[MIDLEN] = ""; struct hostent* host; struct sockaddr_in server_addr; if ((sockfd = socket(AF_INET, SOCK_STREAM原创 2021-01-07 18:20:57 · 829 阅读 · 0 评论 -
socket端口复用
场景:socket监听端口后,程序异常退出,导致端口TIME_WAIT,再次拉起程序时,由于当前端口尚未释放,导致启动的程序占用了其他端口。解决办法:///允许重用本地地址和端口:///这样的好处是,即使socket断了,调用前面的socket函数也不会占用另一个,而是始终就是一个端口///这样防止socket始终连接不上,那么按照原来的做法,会不断地换端口。/*端口复用*/int opt = 1;setsockopt(sockfd, SOL_SOCKET, SO_RE...原创 2021-01-07 18:12:55 · 882 阅读 · 0 评论 -
socket epoll模型
linux 使用epoll主要目的是啥 为了实现非阻塞么?socket本来就有阻塞和非阻塞两种模式,与epoll无关。epoll是针对多socket操作(从select升级到poll再到epoll都是解决这个目的)。如果不用poll方法,在阻塞模式下,操作多socket,要么用多线程,要么用多进程,都会带来一定的开发复杂度和性能降低。在非阻塞模式下,就要使用轮询,浪费处理能力很厉害。所以,epoll是为了让程序只在一个线程中就能操作大量socket而提供的一个核心功能,同时还提供了很高的处理原创 2021-01-07 18:08:01 · 884 阅读 · 0 评论 -
线程池使用
场景:初始化时,创建好线程池,使用时,根据资源使用情况,调用多少个线程。避免了程序循环执行时,需要不停创建线程的情况。上源码:/************************************************************************* module : 线程池头文件* file name : lib_thread_pool.h* Author : * version : V1.0* DATE : * directory .原创 2020-12-29 18:38:45 · 133 阅读 · 0 评论 -
C-fork()处理僵死进程
#include <stdio.h>#include <stdlib.h>#include <sys/wait.h>int main(){ printf("father pid = %ld\n", (long)getpid()); pid_t pid; if( (pid = fork()) < 0) { printf("fork error\n"); } else if(pid == 0) .原创 2020-07-10 17:24:17 · 204 阅读 · 0 评论 -
socket传输大文件demo,附各函数原型
功能:实际研发过程中,发现要从服务端发送大的数据文件给客户端,但socket一次发送的数据包大小是有限制的,需要循环发送;循环发送需要考虑到文件何时发送完毕,所以,这里服务端先发送文件大小给客户端,然后再发送文件,客户端根据接收文件大小进行判定。/**struct sockaddr_in 结构体*在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义*/struct sockaddr_in{ sa_f.原创 2020-06-28 13:03:14 · 1061 阅读 · 1 评论 -
windows下使用winpcap解析网络数据包
windows下库文件,可以读取windows网卡中数据包,并进行解析。操作如下:vs2019添加winpcap库1、https://www.winpcap.org/devel.htm下载winpcap SDK包2、winpcap SDK包解压出来之后,有lib跟include目录3、将include、lib添加到vs2019项目环境下4、vs项目中增加头文件与lib库路径5、上代码#define WIN32#define HAVE_REMO.原创 2020-05-27 15:49:24 · 7282 阅读 · 0 评论 -
TCP/IP头部结构体
// i386 is little_endian. #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN (1) //BYTE ORDER #else #error Redefine LITTLE_ORDER #endif //Mac头部,总长度14字节 typedef struct _eth_hdr { unsigned char dstmac[6]; //目标mac地址 unsigned.转载 2020-05-26 17:58:06 · 567 阅读 · 0 评论 -
【问题记录】socket断开之后,端口长时间处于CLOSE_WAIT状态
开发过程中,使用socket通信时,发现客户端发送完消息之后,主动关闭了套接字,但服务端没有主动关闭,会出现服务端上端口长时间CLOSE_WAIT的情况。客户端是在windows上,服务端是在centos上。解决方法:服务端处理完成之后,也要将套接字主动关闭。可能还有其他没有考虑到的地方,后续再继续补充。...原创 2020-04-22 10:02:26 · 1000 阅读 · 0 评论 -
内存泄漏-valgrind工具
1、安装源码下载:http://valgrind.org/downloads/current.htmltar jxvf valgrind-3.14.0.tar.bz2cd valgrind-3.14.0/./autogen.sh./configuremakemake install2、安装成功之后即可使用命令valgrindvalgrind --help即...原创 2020-03-20 15:24:04 · 277 阅读 · 0 评论 -
C语言-双向循环链表
功能:实现双向循环链表做数据插入,删除使用#include <stdio.h>#include <stdlib.h>#include <string.h>#define RET_OK 1#define RET_ERROR 0#define UDPLEN 1024//链表的类型typedef struct LNode { char ...原创 2020-03-18 15:31:15 · 220 阅读 · 0 评论 -
udp socket
服务端:#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <string.h>#define PORT 4321#define M...原创 2020-03-04 17:45:59 · 210 阅读 · 0 评论 -
C语言解析pcap数据包格式
通过tcpdump命令或者wireshark抓取数据包。如下图所示:pcap文件格式: 24字节pcap文件头+(16字节pcap数据包头+数据包)*n解析源码如下:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<netinet/in.h>...原创 2020-02-25 17:14:14 · 10647 阅读 · 3 评论 -
socket编程之select
Linux编程之select:select作用是:在一段指定的时间内,监听用户感兴趣的文件描述符上可读、可写和异常等事件。1、socket阻塞模式通常在socket编程中,我们习惯于写connect、accept、recv、recvfrom这样的阻塞程序。如果事件不发生,程序就一直阻塞在那里,无法返回。2、socket非阻塞模式:select用select就可以完成...原创 2019-08-30 13:54:43 · 2973 阅读 · 2 评论 -
多线程pthread使用
pthread_create头文件:#include <pthread.h>原型:intpthread_create(pthread_t*tidp,constpthread_attr_t*attr, (void*)(*start_rtn)(void*),void*arg);作用:创建一个线程编译链接参数:-lpthread返回值:线程创建成功返回0,创建失败...原创 2019-08-24 20:04:22 · 409 阅读 · 0 评论 -
多线程pthread使用时资源释放
多线程pthread使用时资源释放两种方法:1、使用pthread_join#include <stdio.h>#include <pthread.h>void *add1(){ //pthread_detach(pthread_self()); printf("AAAAA\n"); pthread_exit(NULL); r...原创 2019-08-24 17:25:52 · 1301 阅读 · 0 评论 -
tcpdump简单抓包分析
socket传输数据时,如果不采用加密的方式,使用tcpdump抓包可获取传输数据,这里简单记录一下,用于以后深入分析。socket通信可以参考之前写的博客:https://blog.youkuaiyun.com/xiadeliang1111/article/details/85210205服务端启动之后:客户端发送:./client 127.0.0.1 "welc...原创 2019-05-20 16:08:51 · 3946 阅读 · 0 评论 -
C语言读写文件
一:打开文件句柄//参数1:文件路径//参数2:文件打开模式函数执行成功返回文件流指针,错误返回NULL。FILE *fopen(const char *path, const char *mode);模式 操作 区别 文件要求r 读 ...原创 2019-04-21 22:20:38 · 59006 阅读 · 3 评论 -
socket通信(ipv4,ipv6)
实现socket通信,IPV4地址与IPV6地址。 服务端:server.c#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string....原创 2018-12-22 16:14:02 · 7671 阅读 · 0 评论 -
signal()函数介绍
头文件:#include <signal.h>signal()函数:typedef void (*__sighandler_t) (int);__sighandler_t signal (int __sig, __sighandler_t __handler);第一个参数是要捕捉的信号(linux下查看信号:kill -l,9号SIGKILL信号不能被捕捉 ...转载 2018-11-22 20:15:38 · 3602 阅读 · 0 评论