




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 / 27 socket 编程函数总结 1 2 3 4 5 I/O fopen(3) 调用 open(2)打开指定的文件,返回一个文件描述符,分配一个 FILE结构体,其中包含该文件的描述符、 I/O缓冲区和当前读写位置等信息,返回这个 FILE结构体的地址。 fgetc(3) 2 / 27 通过传入的 FILE *参数找到该文件的描述符、 I/O 缓冲区和当前读写位置,判断能否从 I/O缓冲区中 读到下一个字符,如果能读到就直接返回该字符,否则调用 read(2),把文件描述符传进去,让内核读取该文件的数据到 I/O缓冲区,然后返回下一个字符。注意,对于 C 标准 I/O 库来说,打开的文件由 FILE *指针标识,而对于内核来说,打开的文件由文件描述符标识,文件描述符从 open 系统调用获得,在使用read、 write、 close 系统调用时都需要传文件描述符。 fputc(3) 判断该文件的 I/O 缓冲区是否有空间再存放一个字符,如果有空间则直接保存在 I/O 缓冲区中并返回,如果 I/O 缓冲区已满就调用 write(2),让内核把 I/O缓冲区的内容写回文件。 fclose(3) 如果 I/O 缓冲区中还有数据没写回文件,就调用 write(2)写回文件,然后调用 close(2)关闭文件,释放 FILE 结构体和 I/O缓冲区。 Open:open 函数可以打开或创建一个文件,函数返回值 是文3 / 27 件描述符。 #include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); Eg: int fd, n, i; fd = open(/dev/tty, O_RDONLY|O_NONBLOCK); Closeclose函数关闭一个已打开的文件,函数参数是文件描述符。 #include int close(int fd); 4 / 27 返回值:成功返回 0,出错返回 -1 并设置 errno Read()read函数从打开的设备或文件中读取数据。 #include ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回读取的字节数,出错返回 -1并设置 errno,如果在调 read之前已到达文件末尾,则这次 read返回 0 write()write 函数向打开的设备或文件中写数据。 #include ssize_t write(int fd, const void *buf, size_t count); 返回值:成功返回写入的字节数,出错返回 -1 并设置 errno write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY); 文件描述符 5 / 27 用户程序不能直接访问内核中的文件描述符表,而只能使用文件描述符表的索引,这些索引就称为文件描述符,用 int 型变量保存。 程序启动时会自动打开三个文件:标准输入、标准输出和标准错误输出。在 C 标准库中分别用 FILE * 指针 stdin、stdout 和 stderr 表示。这三个文件的描述符分别是 0、 1、2 errno: errno是一个全局变量,很多系统函数都会改变它。 有些函数的错误码并不保存在 errno 中 perror: perror 函数将错误信息打印到标准错误输出,首先打印参数s 所指的字符串,然后打印 :号,然后根据当前 errno 的值打印错误原因。 6 / 27 strerror strerror函数可以根据错误号返回错误原因字符串。有些函数的错误码并不保存在 errno中,而是通过返回值返回,就不能调用 perror打印错误原因了,这时就得使用 strerror 常用函数 网络字节与主机字节转换函数 #include uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); Eg: _port=htons(servPort); 客户端 7 / 27 ntohs(): 服务器 地址转换函数 printable to numberic int inet_pton(int family, const char *strptr, void *dst); const char *inet_ntop(int family, const void *src, char *dst, size_t len); 套接字函数 int socket(int family, int type, int protocol); 例如: listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int close (int socket); int connect(int socket,const struct sockaddr * address, socklen_t length) int bind 8 / 27 int listen int accept(int socket ,struct sockaddr * clientAddr, soclen_t *addrLength) int recv int send IPV4 与 ipv6 的不同 地址结构体: 通用: struct sockaddr sa_family_t sa_family; char sa_data14; ; 问题一:写 C+ Socket 有关的程序遇到,以下错误 错误 2 error LNK2019: 无法解析的外部符号 9 / 27 _imp_WSACleanup0 , 该 符 号 在 函 数 int _cdecl InitWinsock(void) (?InitWinsockYAHXZ) 中 被 引 用 E:学习程序 C+NALUH264NALUH264 NALUH264 解决方法:在添加头文件处,添加引用: #pragma comment(lib,ws2_) 问题二:在 linux 下不需要构造 ipharder 在中可以查看 IP包头结构 struct iphdr 可直接定义: struct iphdr * ip_header;/IP 包头 问题三:读 wireshark 中的 txt文档实时性不好 使用 windows自带 数据包捕获软件 winsock 问题四: socket函数来创建一个能够进行网络通信的套接字 10 / 27 其中套接字类型为原始套接字 SOCK_RAW,因为 WinSock接口并不适用某种 特定的协议去封装它,而是由程序自行处理数据报以及协议首部 问题五: bind 函数中本地 IP 值赋为 0 时,内核会自动把本地 IP绑定在空 socket上 问题六:强制类型转换,使得接收到的数据包转换成 IP 头部? 因为 recv 中 buffer 的大小规定为一个 ip_hdr的大小 问题七:错误 3 error C1010: 在查找预编译头时遇到意外的文件结尾。 忘记了向源中添加 “#include ”? 问题八:端口号是多少 随便。只要不和公共端口冲突就可以。 11 / 27 问题九: IP 头部中 Version 和 HarderLength 为前八位,不够一个 BYTE 所以合并为一个 Version_IHL,需要版本号则右移 4 位,需要长度则只取 低 4 位。而首部长度为该值 *4 问题十:将 IP 显示为一个互联网标准点分格式的字符串使用 inet_ntoa 函数,存储使用 inet_addr(); 需要完善的地方: 问题十一: MAC层数据在哪 问题十二: 字符顺序 问题十三:发送报告未完成 问题十四:没有封装改变参数的函数,以及外部调用的makefile文件 实验心得体会 12 / 27 在本次实验中,我通过对网络课上所学知识的应用,学到了很多实践中的知识。并且加深了我对课本知识的理解和认识,在实验过程中,更容易记忆和深入理解各种协议的工作以及在网络编程中应该注意的一系列问题。 我们的第一个实验是对 ARP、 ICMP、 FTP 和 HTTP协议的分析和验证。在利用软件 Etherpeek 抓取在主机通信中的报文,得到了很多的关于这些协议的具体参数。在课程学习过程中,书本和老师给我的感觉就是太枯燥,通过课本的学习根本没有办法理解各种协议的工作细节。有很多的细微之处是想不通的。但是,在本次实验中,我就通过各种报文的分析,看到了网络中不同层次协议之间的协做过程。对应不同层之间就是通过协议来使用,我对整个网路的大体架构有了一个统筹的了解,虽然对很多的更深入的知识不是很了解,但是比我在课上学的东西要更有趣,而且容易学习,更能够我学习的兴趣。 第二个实验是 Socket编程实验。在编写网络程序之前,我对网路通信可以说一无所知,根本不知道那些网路上的程序是怎么通过网路进行通信的。在本次实验中,终于揭开了他们神秘的面纱。当然在实验中出现了很多的插曲,我是在 Linux 环境下编写的程序,很多技术方面的问题都无法解决。查阅书籍和网上咨询才弄懂了他们的来龙去13 / 27 脉,最终是将我的程序编写完了。开始接触网路编程时,那是一头雾水,根本不知从何下手。在看了辅导教员给我们程序之后才有了很 多的起色,才能够自己编写程序。在网络编程中,我最深的体会就是对具体的内部细节不熟悉,导致在调试的过程中感觉到很无力。在很多函数的作用下,经常就是一团乱麻。之后,我每次编写之前就是将用到的函数的用法温习一下,最后还是能够解决很多的问题的。 本次试验是我们学习网路的第一次。以前的课程从来没有接触到网路方面的知识。这次的新知识对我们的挑战还算不是太大,通过我们的努力,所有的困难时被克服掉了。其实,实验应该是我们的重点,在以后的工作中要的就是我们的实际的动手能力,如果我们在学习期间就是只学了书本上的知识,那样对理论的了解是不够深刻的,只有通过实验才能激发我们的学习兴趣。总之,我觉得实验才是检验理论的唯一标准。 【 IP地址转换函数】 点分十进制 整数 inet_pton和 inet_ntop这 2个函数能14 / 27 够处理 ipv4 和 ipv6。算是比较新的函数了。 #include #include #include / arpa/:提供 IP 地址转换函数 sys/:数据类型定义 sys/:提供 socket 函数及数据结构 netinet/:定义数据结构 sockaddr_in arpa/:提供 IP地址转换函数 :提供设置及获取域名的函数 sys/:提供对 I/O 控制的函数 15 / 27 sys/:提供 socket 等待测试机制的函数 其他在网络程序中常见的头文件 :提供通用的文件、目录、程序及进程操作的函数 :提供错误号 errno的定义,用于错误处理 :提供对文件控制的函数 :提供有关时间的函数 :提供使用 DES加密算法的加密函数 :提供对 /etc/passwd 文件访问的函数 :提供对 /etc/shadow 文件访问的函数 :提供多线程操作的函数 :提供对信号操作的函数 16 / 27 sys/、 sys/、 sys/:提供进程等待、进程间通讯及共享内存的函数 建议:在编写网络程序时,可以直接使用下面头文件代码 #include #include #include #include #include #include #include #include #include 17 / 27 #include #include #include #include #include #include #include 涉及到用户权限及密码验证问题时加入如下语句: #include #include #include 18 / 27 需要注意的是,应该在编译时链接加密算法库,即增加编译选项: -lcrypt 涉及到文件及时间操作加入如下语句: #include #include #include #include #include 涉及到多进程操作时加入如下语句: #include 19 / 27 #include #include #include 涉及到多线程操作时加入如下语句: #include #include 需要注意的是,应该在编译时链接线程库,即增加编译选项: -lthread socket 编程常用函数 struct sockadd unsigned short sa_family; 20 / 27 char sa_data14; 用于 bind, connect, recvfrom, sendto struct sockaddr_in short int sin_family; /AF_INET unsigned short int sin_port; /网络字节顺序 struct in_addr sin_addr; /struct in_addr unsigned long s_addr; unsigned char sin_zero8; sample: struct sockaddr_in sa; 21 / 27 _family = AF_INET; _port = htons(3490); _addr = inet_addr(”); baero(&(_zero),8); 转换函数: unsigned long inet_addr(const char *cp); char* inet_ntoa(strct in_addr in); 字节 顺序转换: htons() -Host to network short htonl() Host to network long ntohs() -Network to host short 22 / 27 ntohl() Network to host long 取得本地主机名 int gethostname (char *hostname, size_t size); 取得本地信息 int getsockname(int sockfd, struct sockaddr* addr, int * addrlen); 例如: struct sockaddr_in sa; int len=sizeof(sa); getpeername(sockfd, (struct sockaddr*)&sa, &len); printf(”local IP:%s”, inet_ntoa(_addr); 23 / 27 获得 DNS 信息 struct hostent * gethostbyname(const char* name); struct hostent* gethostbyaddr(const char* addr, int len, int type); 读取或改变 socker 属性 int getsockopt(int sockfd, int level, int name, char* value, int* optlen); int setsockopt(.); 对于 socket 编程: level一般为 SOL_SOCKET 常用: SO_RCVTIMEO, SO_SNDTIMEO SO_SNDBUF, SO_RCVBUF: buffer size 24 / 27 . (来自 : 海 达范文网 :socket 编程函数总结 ) 网络连接 int socker(int domain, int type, int protocol); return -1 means error domain : AF_INET protocol: 一般 0 TCP: sockfd = socket(AF_INET, SOCK_STREAM, 0); UDP: sockfd = socket(AF_INET, SOCK_DGRAM, 0); 绑定端口 int bind(int sockfd, st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年大孔烧结空心砖项目投资申请报告代可行性研究报告
- 2024年抗寄生虫病药项目资金需求报告代可行性研究报告
- 仪表工试题复习试题及答案
- Photoshop平面设计(第二版)课件:广告设计
- 江苏省南京市协同体七校2025届高三期中联考-物理试题(含答案)
- 2025年鹿茸的性状鉴别试题
- 职业资格-公路水运公共基础真题库-4
- 有效提升2025年工程法规考试成绩的策略试题及答案
- 山东汽修专业考试试题及答案
- 注会审计考试试题及答案
- 企业成本控制的问题与解决对策
- 武汉市2025届高中毕业生二月调模拟卷试题
- 高级英语I(下)-华东理工大学知到智慧树章节测试课后答案2024年秋华东理工大学
- 《东方物探HSE管理》课件
- 外科主治医师资格考试(专业代码317)历年真题及答案
- 贵州省2025届高考英语二模试卷含解析
- 2024年公务员考试申论课件:全面掌握答题技巧
- 《传染病疫情应急预案管理办法》解读
- 主题英语知到智慧树章节测试课后答案2024年秋中南大学
- 《祷告的教会》课件
- 《广州恒大俱乐部》课件
评论
0/150
提交评论