linux网络编程常用头文件
- 格式:docx
- 大小:17.44 KB
- 文档页数:3
sockaddrstruct sockaddr {unsigned short sa_family; /* address family, AF_xxx */char sa_data[14]; /* 14 bytes of protocol address */};sa_family是地址家族,一般都是“AF_xxx”的形式。
好像通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构sockaddr_insockaddr_in(在netinet/in.h中定义):struct sockaddr_in {short int sin_family; /* Address family */unsigned short int sin_port; /* Port number */struct in_addr sin_addr; /* Internet address */unsigned char sin_zero[8]; /* Same size as struct sockaddr */};struct in_addr {unsigned long s_addr;};typedef struct in_addr {union {struct{unsigned char s_b1,s_b2,s_b3,s_b4;} S_un_b;struct {unsigned short s_w1,s_w2;} S_un_w;unsigned long S_addr;} S_un;} IN_ADDR;sin_family指代协议族,在socket编程中只能是AF_INETsin_port存储端口号(使用网络字节顺序)sin_addr存储IP地址,使用in_addr这个数据结构sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
linux串口编程参数配置详解1.linux串口编程需要的头文件#include <stdio.h> //标准输入输出定义#include <stdlib.h> //标准函数库定义#include <unistd.h> //Unix标准函数定义#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> //文件控制定义#include <termios.h> //POSIX中断控制定义#include <errno.h> //错误号定义2.打开串口串口位于/dev中,可作为标准文件的形式打开,其中:串口1 /dev/ttyS0串口2 /dev/ttyS1代码如下:int fd;fd = open(“/dev/ttyS0”, O_RDWR);if(fd == -1){Perror(“串口1打开失败!”);}//else//fcntl(fd, F_SETFL, FNDELAY);除了使用O_RDWR标志之外,通常还会使用O_NOCTTY和O_NDELAY这两个标志。
O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。
O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。
3.设置波特率最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用termios.h头文件中定义的termios结构,如下:struct termios{tcflag_t c_iflag; //输入模式标志tcflag_t c_oflag; //输出模式标志tcflag_t c_cflag; //控制模式标志tcflag_t c_lflag; //本地模式标志cc_t c_line; //line disciplinecc_t c_cc[NCC]; //control characters}代码如下:int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B384 00, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9 600, 4800, 2400, 1200, 300, };void SetSpeed(int fd, int speed){int i;struct termios Opt; //定义termios结构if(tcgetattr(fd, &Opt) != 0){perror(“tcgetattr fd”);return;}for(i = 0; i < sizeof(speed_arr) / sizeof(int); i++){if(speed == name_arr[i]){tcflush(fd, TCIOFLUSH);cfsetispeed(&Opt, speed_arr[i]);cfsetospeed(&Opt, speed_arr[i]);if(tcsetattr(fd, TCSANOW, &Opt) != 0){perror(“tcsetattr fd”);return;}tcflush(fd, TCIOFLUSH);}}}注意tcsetattr函数中使用的标志:TCSANOW:立即执行而不等待数据发送或者接受完成。
一服务器源代码#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <unistd.h>#include <arpa/inet.h>#include <openssl/ssl.h>#include <openssl/err.h>#define MAXBUF 1024/************关于本文档*********************************************filename: ssl-server.c*purpose: 演示利用OpenSSL 库进行基于IP层的SSL 加密通讯的方法,这是服务器端例子*wrote by: zhoulifa(zhoulifa@) 周立发()Linux爱好者Linux知识传播者SOHO族开发者最擅长C语言*date time:2007-02-02 19:40*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途* 但请遵循GPL*Thanks to:Google*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!*********************************************************************/int main(int argc, char **argv){int sockfd, new_fd;socklen_t len;struct sockaddr_in my_addr, their_addr;unsigned int myport, lisnum;char buf[MAXBUF + 1];SSL_CTX *ctx;if (argv[1])myport = atoi(argv[1]);elsemyport = 7838;if (argv[2])lisnum = atoi(argv[2]);elselisnum = 2;/* SSL 库初始化*/SSL_library_init();/* 载入所有SSL 算法*/OpenSSL_add_all_algorithms();/* 载入所有SSL 错误消息*/SSL_load_error_strings();/* 以SSL V2 和V3 标准兼容方式产生一个SSL_CTX ,即SSL Content Text */ ctx = SSL_CTX_new(SSLv23_server_method());/* 也可以用SSLv2_server_method() 或SSLv3_server_method() 单独表示V2 或V3标准*/if (ctx == NULL) {ERR_print_errors_fp(stdout);exit(1);}/* 载入用户的数字证书,此证书用来发送给客户端。
linux的include的用法在Linux中,`include` 是一个关键字,用于在C和C++编程语言中引入头文件。
包含头文件是将预定义的函数、宏、结构和其他数据类型引入到程序中的一种方法。
头文件包含在源文件中,并在编译过程中被编译器引用。
通过包含头文件,可以在程序中使用头文件中定义的函数、宏和其他定义,而无需重新实现它们。
下面是`include` 的用法:1. `#include <header.h>`:这种形式的`include` 是用于引入系统的标准库头文件。
`<header.h>` 是标准库头文件的名称。
例如,`#include <stdio.h>` 用于引入标准输入输出函数库的头文件。
2. `#include "header.h"`:这种形式的`include` 是用于引入用户自定义的头文件。
`"header.h"` 是用户自定义头文件的名称。
例如,`#include "myheader.h"` 用于引入名为`myheader.h` 的用户自定义头文件。
在包含头文件之前,编译器会搜索系统的标准库和用户指定的目录来查找头文件。
通常,标准库的头文件通常在`/usr/include` 或`/usr/local/include` 等目录中,而用户自定义的头文件可以放在任何目录中。
需要注意的是,头文件在编译过程中只是一个引用,不会直接被执行,所以可以在程序文件中多次引用同一个头文件。
此外,还可以使用条件编译指令如`#ifndef` 和`#define` 来避免重复引用同一个头文件。
综上所述,`include` 用于在Linux中引入头文件以便在程序中使用预定义的函数、宏和其他定义。
Linux(CC++)下的⽂件操作open、fopen与freopenopen是下的底层系统调⽤函数,fopen与freopen c/c++下的标准I/O库函数,带输⼊/输出缓冲。
linxu下的fopen是open的封装函数,fopen最终还是要调⽤底层的系统调⽤open。
所以在linux下如果需要对设备进⾏明确的控制,那最好使⽤底层系统调⽤(open),open对应的⽂件操作有:close, read, write,ioctl 等。
fopen 对应的⽂件操作有:fclose, fread, fwrite, freopen, fseek, ftell, rewind等。
freopen⽤于重定向输⼊输出流的函数,该函数可以在不改变代码原貌的情况下改变输⼊输出环境,但使⽤时应当保证流是可靠的。
详细见第3部分。
-------------------------------------------------------------------------------------------------------------------open和fopen的区别:1,fread是带缓冲的,read不带缓冲.2,fopen是标准c⾥定义的,open是POSIX中定义的.3,fread可以读⼀个结构.read在linux/unix中读⼆进制与普通⽂件没有区别.4,fopen不能指定要创建⽂件的权限.open可以指定权限.5,fopen返回⽂件指针,open返回⽂件描述符(整数).6,linux/unix中任何设备都是⽂件,都可以⽤open,read.-------------------------------------------------------------------------------------------------------------------1、open系统调⽤(linux)需要包含头⽂件:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>函数原型:int open( const char * pathname, int oflags);int open( const char * pathname,int oflags, mode_t mode);mode仅当创建新⽂件时才使⽤,⽤于指定⽂件的访问权限。
更新 Linux 内核头文件(linux headers)三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文件是比较容易的事情,在 Ubuntu/Fedora 等操作系 统上,可以直接安装相应的 linux-headers 软件包,下面就演示了在 Ubuntu 上安装内核头文件的过程。
View Code BASH1 2 3 4 5 6 7 8 9 master@jay-intel:~/workspace/c-study$ uname -r 3.2.0-33-generic master@jay-intel:~/workspace/c-study$ apt-get install linux-headers-$(uname -r) Reading package lists... Done Building dependency tree Reading state information... Done linux-headers-3.2.0-33-generic is already the newest version. linux-headers-3.2.0-33-generic set to manually installed. 0 upgraded, 0 newly installed, 0 to remove and 331 not upgraded.然而,如果自己编译 Linux kernel 并用它启动了系统,然后为了让本地程序基于当前 kernel 的 headers 来编译,就需要自己手动更新内核的头文件了。
手动更新 linux headers 的步骤如下: 1. 在 Linux kernel 目录中,执行“make headers_install”命令,将 headers 安装到当前目录的 usr/include/下面。
更新 Linux 内核头文件(linux headers)三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文件是比较容易的事情,在 Ubuntu/Fedora 等操作系 统上,可以直接安装相应的 linux-headers 软件包,下面就演示了在 Ubuntu 上安装内核头文件的过程。
View Code BASH1 2 3 4 5 6 7 8 9 master@jay-intel:~/workspace/c-study$ uname -r 3.2.0-33-generic master@jay-intel:~/workspace/c-study$ apt-get install linux-headers-$(uname -r) Reading package lists... Done Building dependency tree Reading state information... Done linux-headers-3.2.0-33-generic is already the newest version. linux-headers-3.2.0-33-generic set to manually installed. 0 upgraded, 0 newly installed, 0 to remove and 331 not upgraded.然而,如果自己编译 Linux kernel 并用它启动了系统,然后为了让本地程序基于当前 kernel 的 headers 来编译,就需要自己手动更新内核的头文件了。
手动更新 linux headers 的步骤如下: 1. 在 Linux kernel 目录中,执行“make headers_install”命令,将 headers 安装到当前目录的 usr/include/下面。
Linux 常用C函数(文件操作篇)close(关闭文件)open,fcntl,shutdown,unlink,fclose表头文件 #include<unistd.h>定义函数 int close(int fd);函数说明当使用完文件后若已不再需要则可使用close()关闭该文件,二close()会让数据写回磁盘,并释放该文件所占用的资源。
参数fd为先前由open()或creat()所返回的文件描述词。
返回值若文件顺利关闭则返回0,发生错误时返回-1。
错误代码 EBADF 参数fd 非有效的文件描述词或该文件已关闭。
附加说明虽然在进程结束时,系统会自动关闭已打开的文件,但仍建议自行关闭文件,并确实检查返回值。
范例参考open()creat(建立文件)相关函数 read,write,fcntl,close,link,stat,umask,unlink,fopen表头文件 #include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>定义函数 int creat(const char * pathname, mode_tmode);函数说明参数pathname指向欲建立的文件路径字符串。
Creat()相当于使用下列的调用方式调用open()open(const char * pathname ,(O_CREAT|O_WRONLY|O_TRUNC));错误代码关于参数mode请参考open()函数。
返回值 creat()会返回新的文件描述词,若有错误发生则会返回-1,并把错误代码设给errno。
EEXIST 参数pathname所指的文件已存在。
EACCESS 参数pathname 所指定的文件不符合所要求测试的权限EROFS 欲打开写入权限的文件存在于只读文件系统内EFAULT 参数pathname 指针超出可存取的内存空间EINVAL 参数mode 不正确。
linux创建socket收发链路层报文的c语言代码引言概述:在Linux操作系统中,使用C语言编写代码可以创建socket并进行收发链路层报文的操作。
本文将详细介绍如何使用C语言编写代码来实现这一功能。
正文内容:1. socket的创建1.1. 引入必要的头文件:在C语言代码中,需要引入一些必要的头文件,如<sys/types.h>、<sys/socket.h>和<netinet/in.h>等,以便使用相关的函数和数据结构。
1.2. 创建socket:使用socket()函数可以创建一个socket,该函数需要指定协议族、套接字类型和协议类型等参数。
常用的协议族有AF_PACKET(链路层协议族)、AF_INET(IPv4协议族)和AF_INET6(IPv6协议族)等。
1.3. 设置socket选项:可以使用setsockopt()函数来设置socket的选项,如设置接收和发送缓冲区的大小等。
2. 绑定socket2.1. 创建一个用于绑定的结构体:使用struct sockaddr_ll结构体来保存链路层地址信息,包括接口索引、协议类型和目标MAC地址等。
2.2. 绑定socket:使用bind()函数将socket与特定的链路层地址绑定,以便接收和发送链路层报文。
3. 发送链路层报文3.1. 构建报文:使用C语言的数据结构和函数来构建链路层报文,包括设置目标MAC地址、源MAC地址、协议类型和数据等。
3.2. 发送报文:使用sendto()函数发送链路层报文,该函数需要指定socket、报文数据和报文长度等参数。
4. 接收链路层报文4.1. 创建一个接收缓冲区:使用malloc()函数动态分配一个足够大的缓冲区来接收链路层报文。
4.2. 接收报文:使用recvfrom()函数接收链路层报文,该函数需要指定socket、接收缓冲区和缓冲区大小等参数。
5. 关闭socket5.1. 关闭socket:使用close()函数关闭已创建的socket,释放相关资源。
linux下socket编程常用头文件
sys/types.h:数据类型定义
sys/socket.h:提供socket函数及数据结构
netinet/in.h:定义数据结构sockaddr_in
arpa/inet.h:提供IP地址转换函数
netdb.h:提供设置及获取域名的函数
sys/ioctl.h:提供对I/O控制的函数
sys/poll.h:提供socket等待测试机制的函数
其他在网络程序中常见的头文件
unistd.h:提供通用的文件、目录、程序及进程操作的函数
errno.h:提供错误号errno的定义,用于错误处理
fcntl.h:提供对文件控制的函数
time.h:提供有关时间的函数
crypt.h:提供使用DES加密算法的加密函数
pwd.h:提供对/etc/passwd文件访问的函数
shadow.h:提供对/etc/shadow文件访问的函数
pthread.h:提供多线程操作的函数
signal.h:提供对信号操作的函数
sys/wait.h、sys/ipc.h、sys/shm.h:提供进程等待、进程间通讯(IPC)及共享内存的函数
建议:在编写网络程序时,可以直接使用下面这段头文件代码
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <fcntl.h>
涉及到用户权限及密码验证问题时加入如下语句:
#include <shadow.h>
#include <crypt.h>
#include <pwd.h>
需要注意的是,应该在编译时链接加密算法库,即增加编译选项:-lcrypt
涉及到文件及时间操作加入如下语句:
#include <sys/time.h>
#include <utime.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/file.h>
涉及到多进程操作时加入如下语句:
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>
涉及到多线程操作时加入如下语句:
#include <pthread.h>
#include <sys/poll.h>
需要注意的是,应该在编译时链接线程库,即增加编译选项:-lthread。