由于记忆力有限,为了用补全功能,并且不受不常用的 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;
}