标签汇整: C

C语言中的localtime被多次使用引发的思考

  今天写某个程式时,出现一个奇妙的问题,输出的时间戳总是不正确,查了半天百思不得其解。我把出问题的代码简化成下面的形式:

输出结果是:
debug1::20160818
debug2::20160729
debug3::20160729

  debug2和debug3的位置本想分别输出目前的时间now和前推的时间las,而结果并没有符合预想。看了看代码,在前一次debug1输出now,和后一次debug2输出now之间,并没有对结构体now做任何赋值操作,而now的内容却改变成了和las一样的。
  这个问题让我百思不得其解,怎么看我都没有对now进行操作,唯一的解释就是now和las指针指向的是同一个地址。最后不断的测试缩小范围,把问题锁定到localtime()上。于是上网查询了一下localtime()的文档,发现localtime()不仅不是线程安全的函数,不建议使用,而且只能同时使用一次,因为localtime()不是可重入的。
  所以说我的now和las确实指向了同一个地址,因为我是在Linux下编译的所以并没有提示,如果在VS下编译就会看见localtime()不是线程安全函数的提示。于是我从网上找到了libc提供的另一个函数localtime_r(),修改程序如下:

输出结果是:
debug1::20160818
debug2::20160818
debug3::20160729

  于是问题解决了,还有要注意的是,Windows下并没有localtime_r,与其相同的函数是localtime_s。

======
kujou_rin

C语言socket编程发送HTTP请求实例

前几天在自己的私服中用c写了一个模拟股市系统,所使用的数据是通过socket发送HTTP请求,然后获得新浪财经的接口页面进行处理。那么现在我们把需求和需要做的事情总结一下:
1、如何发送HTTP请求
2、请求到某个股票网站的输入和输出分别是什么
3、处理收到的字符串数据

先试着写一个简单的HTTP请求发送和接收程序

上面的例子使用非阻塞的recv作为接收,优点是接收后不会阻塞的运行程序进行接下来的输出打印,而缺点是如果返回的页面数据很多,分包之后会发现recv接收的页面是不全的,只有大概2k多数据。所以在实际应用中我使用了read作为接收函数。

我的需求是通过上证股票代码获得开盘收盘和当前价格等信息,已知新浪股票的HTTP接口用法是这样 http://hq.sinajs.cn/?list=sh600000,sh600406 放到浏览器一看就明白了,已经满足通过代码获的所有信息,接下来写具体的处理过程。

下面是我所写的通过股票代码获得实时价格的程序:

由于涉及自己服务器数据库的数据结构,数据库处理过程已经省略。getline得到的每一行可以用sscanf分隔成字符串,然后再使用atof转化为价格数的浮点。引号内的字段可以分别保存到zd[33][50]的二位数组中,关于新浪的股票接口,它们每个字段表示的意义大概如下:
0股票名称;1今开价;2昨收价;3当前价;4今最高;5今最低;……最后是30更新日期和31时间

自用程序写的比较烂,如有缺陷欢迎指正。
=======
kujou_rin

C语言接口远程读取MySQL数据实例

  之前在服务器上搭建了VPN之后,顺便写了一个php的注册页面用于注册VPN的用户,使用MySQL保存用户数据。而pptpd和l2tpd服务则在另一台服务器运行,且通过文件进行用户验证。因此需要将用户密码表单远程从MySQL中取出并在VPN服务器保存为文件。我的解决方案是使用C语音调用MySQL接口然后使用文件流保存,这样的方案同样可用于解决架设多节点的VPN服务。

实例代码如下:

Makefile文件内容如下:

然后只需要再写一个shell脚本添加到 crontab 定时运行该程式并将输出的文件移动为 chap-secrets 即可。

简易的VPN用户管理系统就大功告成了~

======
kujou_rin