说明
为创建一份小型的工程代码,自己想出一个简单的数据传输任务。
主进程创建四个线程,st1,st2,st3,rt,让前三个线程向最后一个线程灌包,最后一个线程接收数据包。
目的IP: 10.21.100.152
目的端口:9001
各个进程被创建后立即进行相应的工作,灌包或者收包。rt接收到数据包后打印出相应的信息。
makefile
工程文件的编译会接触到makefile,下面是总结的常用的makfile变量
变量 | 意义 |
---|---|
$* | 不包含扩展名的目标文件名称。 |
$+ | 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 |
$< | 第一个依赖文件的名称。 |
$? | 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。 |
$@ | 目标的完整名称。 |
$^ | 所有的依赖文件,以空格分开,不包含重复的依赖文件。 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。 |
AR | 静态库打开包命令的名字,default:ar |
ARFLAGS | 静态库打开包命令的选项,default:rv |
AS | 汇编器的名字,default: as |
ASFLAGS | 汇编器的选项 |
CC | C编译器的名字,default: cc |
CFLAGS | C编译器的选项 |
CXX | c++编译器的名字,default: g++ |
CXXFLAGS | c++编译器的选项 |
CPP | C预处理器的名字,default: $(CC) -E |
CPPFLAGS | C预处理器的选项 |
LD | 链接器的名字, default: 1d |
LDFLAGS | 链接器的选项 |
TARGET_ARCH | 和目标平台相关的命令行选项 |
OUTPUT_OPTION | 输出的命令行选项,default: -o $@ |
LINK.o | 把.o文件链接在一起的命令行,default: $(CC) $(LDFLAGS) $(TARGET_ARCH) |
LINK.c | 把 .c 文件链接在一起的命令行, default: $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) |
LINK.cc | 把 .cc 文件(C++源文件)链接在一起的命令行, default: $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) |
COMPILE.c | 编译.c文件的命令行, default: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c |
COMPILE.cc | 编译 .cc 文件的命令行, default: $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c |
RANLIB | 静态库的符号索引表 |
CROSS_COMPILE | 编译器前缀 |
ARCH | CPU体系结构 |
另外一些可能用到的:
STRIP: 去空格函数,去除开头和结尾出现的空字符
addprefix: 加前缀函数
$(addprefix <prefix>, <name-1>, <name-2>...<name-n>)
该函数将前缀 <prefix> 加到各个 <name> 的前面去。
代码结构
图中的.a文件和.d文件是编译后产生的。
.a文件是静态库文件,.d文件为源文件的依赖关系的完整规则。
code
common.h
#ifndef COMMON_H
#define COMMON_H
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sched.h>
#include <unistd.h>
#include <sys/types.h>
#include <malloc.h>
#include <signal.h>
#define Len 20
#define Num 10
#define TASK_JOIN 1
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef int INT32;
typedef struct msg{
UINT8 context[Num][Len];
}Msg;
pthread_t g_st1;
pthread_t g_st2;
pthread_t g_st3;
pthread_t g_rt;