char函数

(十)Linux 网络编程之ioctl函数

旧街凉风 提交于 2019-12-25 03:12:26
1.介绍 Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口.并且还能够查看,修改,删除ARP高速缓存的信息,所以,我们有必要了解一下ioctl函数的具体实现. 2.相关结构体与相关函数 #include int ioctl(int d,int request,....); 参数: d-文件描述符,这里是对网络套接字操作,显然是套接字描述符 request-请求码 省略的部分对应不同的内存缓冲区,而具体的内存缓冲区是由请求码request来决定的,下面看一下具体都有哪些相关缓冲区。 (1)网络接口请求结构ifreq struct ifreq{ #define IFHWADDRLEN 6 //6个字节的硬件地址,即MAC union{ char ifrn_name[IFNAMESIZ];//网络接口名称 }ifr_ifrn; union{ struct sockaddr ifru_addr;//本地IP地址 struct sockaddr ifru_dstaddr;//目标IP地址 struct sockaddr ifru_broadaddr;//广播IP地址 struct sockaddr ifru_netmask;//本地子网掩码地址 struct sockaddr ifru

2019-12-24

我的梦境 提交于 2019-12-25 01:19:33
数组收获与感悟 定义:数组是有序的并且具有相同类型的数据的集合。 一维数组 1、一般形式:类型说明符 数组名[常量表达式];例如: int a[10]; 元素为a[0]----a[9]. 2、常量表达式中不允许包含变量,可以包含常量或符号常量。 3、数组元素下标可以是任何整型常量、整型变量或任何整型表达式。 4、可以对数组元素赋值,数组元素也可以参与运算,与简单变量一样使用。 5、使用数值型数组时,不可以一次引用整个数组,只能逐个引用元素。 6、需要整体赋值时只可以在定义的同时整体赋值。如 int a[10]={0,1,2,3,4,5,6,7,8,9};正确。 int a[10]; a[10]={0,1,2,3,4,5,6,7,8,9};错误。 7、可以只给一部分元素赋值。例如: int a[10]={5,8,7,6};后面没有赋值的元素值默认为0。 8、对全部数组元素赋值时可以不指定数组长度,例如: int a[10]={0,1,2,3,4,5,6,7,8,9};可以写成 int a[]={0,1,2,3,4,5,6,7,8,9}; 但是,既不赋初值,也不指定长度是错误的。例如:int a[];错误。 一维数组的应用: 1.幸运数的划分 问题描述: 判断一个正整数n是否能被一个“幸运数”整除。幸运数是指一个只包含4或7的正整数,如7,47,477等都是幸运数,17

Socket网络编程--简单Web服务器(2)

*爱你&永不变心* 提交于 2019-12-24 22:25:09
  上一小节通过阅读开源的Web服务器--tinyhttpd。大概知道了一次交互的请求信息和应答信息的具体过程。接下来我就自己简单的实现一个Web服务器。   下面这个程序只是实现一个简单的框架出来。这次先实现能够Accept客户端的请求。   简单创建web服务器   webserver.h 1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <errno.h> 7 #include <sys/types.h> 8 #include <sys/socket.h> 9 #include <netinet/in.h> 10 #include <arpa/inet.h> 11 #include <unistd.h> 12 #include <pthread.h> 13 #include <thread>//使用c++11的多线程 14 15 using namespace std; 16 17 class WebServer 18 { 19 public: 20 WebServer(); 21 ~WebServer(); 22 int ServerInit(u_short port); 23 int

delete[] p与delete p的区别

…衆ロ難τιáo~ 提交于 2019-12-24 22:14:53
operator new 和 operator delete函数有两个重载版本,每个版本支持相关的new表达式和delete表达式:void* operator new (size_t); // allocate an object void* operator new [] (size_t); // allocate an array void operator delete (void*); // free an oject void operator delete [] (void*); // free an array熟悉C的朋友看到这里可能会很奇怪: 在c中释放内存用free(void *)【注意这里只有一个参数void *】为什么到了C++里会出现两个!按理说delete 会调用free释放内存的啊? 另外delete []是如何知道删除的对象个数的? 另外一般的教材比如《高质量C++编程指南》都会这么说: 在用delete 释放对象数组时,留意不要丢了符号‘[]’。例如 delete []objects; // 正确的用法 delete objects; // 错误的用法 后者相当于delete objects[0],漏掉了另外99 个对象 这样的描述当然是错误的,而且会误导观众 为了解决问题,打开vc6,输入以下代码:class A { private: int i

使用函数实现字符串部分复制

早过忘川 提交于 2019-12-24 21:40:59
标题 6-23 使用函数实现字符串部分复制 (20分) 6-7 使用函数实现字符串部分复制 (20 分) 本题要求编写函数,将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。 函数接口定义: void strmcpy( char *t, int m, char *s ); 函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。 裁判测试程序样例: #include <stdio.h> #define MAXN 20 void strmcpy( char *t, int m, char s ); void ReadString( char s[] ); / 由裁判实现,略去不表 */ int main() { char t[MAXN], s[MAXN]; int m; scanf("%d\n", &m); ReadString(t); strmcpy( t, m, s ); printf("%s\n", s); return 0; 1 2 3 4 5 6 } /* 你的代码将被嵌在这里 */ 输入样例: 7 happy new year 输出样例: new year` 我的代码如下 void strmcpy ( char * t , int m , char * s ) {

webbench源码阅读

[亡魂溺海] 提交于 2019-12-24 11:49:30
学习内容   一共五百多行代码,其中包含了linux编程常用的API。可以通过学习源码,把不熟悉的API练习练习。 1 如何使用webbench (1)查看参数帮助 (2)运行方法 即以上模拟30个客户端在30秒期间并发请求百度,结果如下: 每分钟平均有1532次请求连接,服务器每秒传输字节为4039230,在30秒期间请求连接成功为766次,失败0次。 2 源码常用函数练习 (1) 选项参数 int getopt_long(int argc, char * const argv[],const char *optstring, const struct option *longopts,int *longindex); 函数中的argc和argv通常直接从main()的两个参数传递而来。optsting是选项参数组成的字符串: option结构数组,option结构称为长选项表,其声明如下: struct option { const char *name; int has_arg; int *flag; int val; }; 结构中的元素解释如下: const char *name:选项名,前面没有短横线。譬如"help"、"verbose"之类。 int has_arg:描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表: 符号常量 数值 含义 no

从零开始,学习windows编程(4)--从libc.lib开始

偶尔善良 提交于 2019-12-24 03:55:14
从上一篇文章中,大家已经了解到有C运行时库这个概念,这个不算是新东西,但是一般都隐藏在幕后,C/C++语言教学的时候不讲,windows/linux编程的时候似乎也不会专门讲到。不过它一般是我们C/C++编程中默认会使用的一个重要部分。回想想,我们随手打出的strcpy, memset, memcpy等等,不就是C运行时库所提供出来的东西吗? 既然这样,就要好好研究一下这个东西了。 前面已经说过,针对单线程/多线程,静态/动态链接,是否是debug版本,VC6的C运行时库提供了6个版本。具体可以看下面的截图。 而其中每一个选择对应的LIB文件,在上一篇中已经有一个列表介绍了,这里就不重复写了。这里也不全部一下子将所有的都研究一下,还是按照由浅入深的原则,从最简单的部分开始,当然,也会在牵涉到其他部分的时候,进行一定的说明。 最简单的当然是Single-Threaded,同时也是static link的了。其对应的文件为LIBC.LIB。对应CL的编译选项为/ML。 既然要研究这个LIB文件,那当然是有源码最好了,jjhou不是说过,“源码面前,了无秘密”吗。那我们在哪里找到有源码呢? 只要你安装了VC6,它就带有CRT的源码,具体目录和你安装VC6的目录有关,在我电脑上的路径为“d:\Program Files\Microsoft Visual Studio\VC98\CRT

关于文本处理之结巴分词

旧时模样 提交于 2019-12-24 00:23:57
中文文本最常用的就我而言应该就是结巴分词的分词工具。当然还有其他分词工具Hanlp、THULAC、LTP、NLPIR等。 结巴分词安装:pip install jieba(全自动安装) or 下载结巴,然后解压运行python setup.py install(半自动) or python3.X 下的安装方式: Github 上 jieba 的 Python3.x 版本的路径是: https://github.com/fxsjy/jieba/tree/jieba3k 通过 git clone https://github.com/fxsjy/jieba.git 命令下载到本地,然后解压,再通过命令行进入解压目录,执行 python setup.py install 命令,即可安装成功。 jieba 的分词算法 主要有以下三种: 基于统计词典,构造前缀词典,基于前缀词典对句子进行切分,得到所有切分可能,根据切分位置,构造一个有向无环图(DAG); 基于DAG图,采用动态规划计算最大概率路径(最有可能的分词结果),根据最大概率路径分词; 对于新词(词库中没有的词),采用有汉字成词能力的 HMM 模型进行切分。 jieba 分词 下面我们进行 jieba 分词练习,第一步首先引入 jieba 和语料: import jieba content = "现如今

delphi指针

元气小坏坏 提交于 2019-12-23 22:24:25
delphi中由于vcl的存在,于是指针很少用到。昨天和“贱男”(一个做sp的朋友)在讨论一个多线程的问题,最后考虑是不是指针传递的错误。 要求是这样的:sql的数据库,程序中的主线程以sql查询获取二十条记录,然后传递给子线程,主线程挂起。while ....not语句,一条条赋给子线程,每子线程存一条记录,以指针传递的(pchar).应用华为的api(vc编写)其中LPCSTR用delphi 中pchar代替,但是最后子线程得到的数据是乱七八遭的东西。不从数据库读取数据,读字符串和变量都是正确的,实在不解?是不是指针传递数据时候出错? 顺便放出pascal的指针: 浅谈Object Pascal的指针 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人 产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今 的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。 以下内容分为八个部分,分别是 一、类型指针的定义 二、无类型指针的定义 三、指针的解除引用 四、取地址(指针赋值) 五、指针运算 六、动态内存分配 七、字符数组的运算 八、函数指针 一、类型指针的定义

Yacc 与 Lex 快速入门

情到浓时终转凉″ 提交于 2019-12-23 21:21:45
developerWorks 中国 > Linux > Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍 文档选项 打印本页 将此页作为电子邮件发送 级别: 初级 Ashish Bansal ( mailto:abansal@ieee.org?subject=Yacc 与 Lex 快速入门&cc=abansal@ieee.org ), 软件工程师, Sapient 公司 2000 年 11 月 01 日 Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具,包括常规表达式、声明、匹配模式、变量、Yacc 语法和解析器代码。最后,他解释了怎样把 Lex 和 Yacc 结合起来。 Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。 让我们从 Lex 开始吧。 Lex Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义,这个我们一会儿就要讨论。 一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记