linux 用户空间应用程序常用头文件

   由于记忆力有限,为了用补全功能,并且不受不常用的 token 影响,只找出常用的头文件放入工程中。

一、查看编译器头文件路径

echo | gcc -v -x c -E -

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/9/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include

二、通用

export INCLUDEPATH=$(pwd) # 头文件拷贝路径
cd /usr/include/
cp -rp --parents stdio.h $INCLUDEPATH/
cp -rp --parents stdlib.h $INCLUDEPATH/
cp -rp --parents errno.h $INCLUDEPATH/
cp -rp --parents string.h $INCLUDEPATH/
cp -rp --parents fcntl.h $INCLUDEPATH/
cp -rp --parents unistd.h $INCLUDEPATH/
cp -rp --parents time.h $INCLUDEPATH/
cp -rp --parents utime.h $INCLUDEPATH/
cp -rp --parents pthread.h $INCLUDEPATH/
cp -rp --parents signal.h $INCLUDEPATH/
cp -rp --parents malloc.h $INCLUDEPATH/
cd /usr/include/x86_64-linux-gnu
cp -rp --parents sys/types.h $INCLUDEPATH/
cp -rp --parents sys/stat.h $INCLUDEPATH/
cp -rp --parents sys/ioctl.h $INCLUDEPATH/
cp -rp --parents sys/wait.h sys/ipc.h sys/shm.h $INCLUDEPATH/
cp -rp --parents sys/time.h sys/file.h $INCLUDEPATH/

三、网络编程

cd /usr/include/
cp -rp --parents netinet/in.h $INCLUDEPATH/
cp -rp --parents arpa/inet.h $INCLUDEPATH/
cp -rp --parents netdb.h $INCLUDEPATH/
cp -rp --parents crypt.h pwd.h shadow.h $INCLUDEPATH/
cp -rp --parents netinet/if_ether.h $INCLUDEPATH/
cp -rp --parents netinet/ether.h $INCLUDEPATH/
cp -rp --parents netinet/ip.h netinet/tcp.h netinet/udp.h $INCLUDEPATH/
cp -rp --parents linux/ip.h linux/tcp.h linux/udp.h $INCLUDEPATH/
cp -rp --parents linux/if.h linux/if_packet.h $INCLUDEPATH/
cp -rp --parents net/ethernet.h $INCLUDEPATH/
cd /usr/include/x86_64-linux-gnu
cp -rp --parents sys/socket.h sys/poll.h $INCLUDEPATH/

include

// common
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// net
#include <arpa/inet.h>
#include <sys/socket.h>

errno

#define error_handling(msg) __error_handling(__FILE__, __func__, __LINE__, errno, msg)

void __error_handling(const char* file,
	const char *func, int line, int err, const char *msg)
{
	char info[256];
	sprintf(info, "[%s][%s][%d] ", file, func, line);
	fputs(info, stderr);
	fputs(msg, stderr);
	if (err) {
		fputs(": ", stderr);
		fputs(strerror(err), stderr);
	}
	fputc('\n', stderr);
	exit(EXIT_FAILURE);
}

net

server

int serv_socket(const char *strport)
{
	char errmsg[256];
	int serv_sock, port;

	struct sockaddr_in serv_addr;

	port = atoi(strport);
	if (port < 1024 || port > 49151) {
		sprintf(errmsg, "port(%d) is invalid", port);
		error_handling(errmsg);
	}

	serv_sock = socket(AF_INET, SOCK_STREAM, 0);
	if (serv_sock == -1) {
		error_handling("socket()");
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	serv_addr.sin_port = htons(port);

	if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
		error_handling("bind error");

	if (listen(serv_sock, 5) == -1)
		error_handling("lister error");

	return serv_sock;
}

int serv_accept(int serv_sock)
{
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;
	int clnt_sock;

	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
	if (clnt_sock == -1)
		error_handling("accept error");

	return clnt_sock;
}

client

int clnt_socket(const char* ipv4, const char* strport)
{
	char errmsg[256];
	int sock, port;

	struct sockaddr_in serv_addr;

	port = atoi(strport);
	if (port < 1024 || port > 49151) {
		sprintf(errmsg, "port(%d) is invalid", port);
		error_handling(errmsg);
	}

	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == -1)
		error_handling("socket error");

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(ipv4);
	serv_addr.sin_port = htons(port);

	if (connect(sock, (void*)&serv_addr, sizeof(serv_addr)) == -1)
		error_handling("connect error");

	return sock;
}

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值