linux c开发: 关于malloc(0)

因为有一个bug栽在malloc(0)上,所以有必要记录一下。先说结论: * malloc(0)是允许的,并且返回一个非NULL的指针,至少在我工作的linux系统上是这样的。man文档里面说: malloc() allocates size bytes and returns a pointer to the allocated memory. The memory is not cleare...
阅读(269) 评论(0)

linux c开发: 程序崩溃时保存堆栈信息并解析具体代码行

写服务器程序最怕的是百分之一的概率崩溃了,你却不知道为啥,想重现又重现不出来。所以在崩溃时将当时的堆栈保存下来非常重要。网上有很多文章讲解怎么保存,但我使用了发现可以保存,但是没有函数名称和行号,仍然没法定位问题。在stack overflow上有人说只有动态库的代码才能显示出函数名和行号,想完整显示还需要使用某某第三方开源库,不过我幸好发现使用addr2line命令可以将文件名和行号显示出来,轻松...
阅读(509) 评论(0)

linux c开发: 在程序退出时进行处理

有时候,希望程序退出时能进行一些处理,比如保存状态,释放一些资源。c语言开发的linux程序,有可能正常退出(exit),有可能异常crash,而异常crash可能是响应了某信号的默认处理。这里总结一下这些情况,如何获取一个统一的退出处理的点,说白了就是写一个回调函数,让他在程序正常或异常退出时调用。 先看正常退出,即调用exit或者main函数return亦或最后一个线程正常退出时,如何捕获退出事...
阅读(458) 评论(0)

linux c开发: 处理命令行参数

在Linux c语言开发时,可使用getopt_long获取命令行参数,这个方法同时支持短选项和长选项,比较方便。(因为选项可以带参数,为了不和命令行参数混淆,这里命令行参数称为选项) 边看代码,边做分析:#include #include //需要包括此头文件// Values for long options // 长选项对应的整数值,在long...
阅读(278) 评论(0)

app扩展输出log到文件并从containing app读取

app扩展,即appex,如today widget,network extension之类。现在有个需求是在开发扩展时,将log输出到文件,在必要的时候获取文件内容进行查看。此处不讨论将log通过网络传输到服务器的情况,也不讨论使用类似CocoaLumberjack这样的第三方库的情况,我们简单的使用NSLog而已。 思路整理:首先,我们要能取得log文件,此处不讨论通过网络将log文件传输到服务...
阅读(266) 评论(0)

(libev) cannot allocate xxx bytes, aborting 问题的一种触发条件

最近在项目中使用了libev,遇到一个很奇怪的crash,服务器运行随机时间后有一定的概率奔溃,输出的最后一行log是: (libev) cannot allocate xxx bytes, aborting。 因为捕捉了SIGINT信号,所以可以确定崩溃就是由于libev的这个abort。开始是以为内存越界之类,排查了strncpy, memset,memcpy等使用的地方,并且使用valgr...
阅读(352) 评论(0)

ss-libev 源码解析udp篇 (4)

本篇分析remote_recv_cb,这是整个udp转发的反方向,即读取从后端发送过来的数据再发送给前端。对于ss-server,读取到的数据是目标地址的udp服务器发送回来的响应数据,ss-server需要将其包装成ss的格式并加密发送给ss-local;对于ss-local接收到的数据就是ss-server发送过来的加密数据,ss-local解密后需要再将其包装成socks5的格式发送给sock...
阅读(1285) 评论(1)

ss-libev 源码解析udp篇 (3)

本篇分析server_recv_cb,这个是udp转发中最重要的函数。server_recv_cb: 当ss-local或ss-server接收到来自前端的udp数据包时调用。这个函数代码比较多,除了local和remote(即ss-server),还有redir, tunnel,android的代码。我们只关注local和remote。 首先,这个函数是注册给server_ctx_t的io的,处理...
阅读(656) 评论(0)

ss-libev 源码解析udp篇 (2)

UDP relay的代码基本都在udprelay.c中,无论ss-local还是ss-server的代码都在一起,使用宏MODULE_LOCAL,MODULE_REMOTE等区分开。代码虽然不是很多,但是由于ss-local和ss-server以及ss-redir,ss-tunnel等夹杂在同一个函数中,不断有宏去打断读代码的思路,并且很多代码还是同时被ss-local和ss-server执行到,所...
阅读(527) 评论(0)

ss-libev 源码解析udp篇 (1)

shadowsocks-libev udp转发原理简介 ss_local作为一个sock5服务器,接收来自socks5客户端的数据包。在ss_local启动后,即创建一个udp socket,并bind到一个端口。该udp socket用于接收所有来自socks5客户端的udp包。 根据socks5规范,socks5客户端和ss_local建立一个tcp连接进行握手,握手成功后ss_local返回上...
阅读(1285) 评论(1)

ss-libev 源码解析local篇(5):ss-local之remote_send_cb

remote_send_cb这个回调函数的工作是将从客户端收取来的数据转发给ss-server。在之前阅读server_recv_cb代码时可以看到,在STAGE_STREAM阶段有几种可能都会开启remote->fd的写事件的监听,从而当有写事件触发时调用remote_send_cb。从代码结构看,外层的分支是remote->send_ctx->connected是否为0,内部的分支是是否fast...
阅读(546) 评论(0)

ss-libev 源码解析local篇(4): server_recv_cb之STAGE_STREAM

继续探索server_recv_cb,我们已经来到了STAGE_STREAM状态。如果在0.05秒的timer来之前客户端就有数据过来,server_recv_cb被调用,此时已经在stream状态就会读入数据到remote的buf中;如果timer先到了就是直接调用的server_recv_cb,并先进入wait状态所以不读取数据。另外在之前的parse状态,remote的buf里面也有一些数据,...
阅读(617) 评论(0)

iOS TUN之避免UDP包ip分片

iOS的NetworkExtension给应用暴露了一个虚拟网卡TUN设备,可以设置其MTU值。如果上层应用发送的IP包大于这个MTU就会被分片。(详见:http://www.jianshu.com/p/741cb12ab0c9 ) * TUN转发UDP包时遇到分片的问题 使用iOS网络扩展开发时,往往需要在TUN中处理数据包,进行处理后重新发送出去。由于通过TUN拿到的是ip包,如果要进行ud...
阅读(627) 评论(0)

ss-libev 源码解析local篇(3): server_recv_cb之SNI和STAGE_PARSE

上一篇看到STAGE_HANDSHAKE中的处理,到发出fake reply。这之后会从socks5 request中解析出remote addr and port,即客户端实际想要访问的服务器地址和端口。根据request->atyp,有三种情况,atyp为1,请求中带的是ipv4的地址,为3是域名,为4是ipv6地址。ss-local会把remote addr & port填入server->a...
阅读(706) 评论(0)

ss-libev 源码解析local篇(2):ss_local和socks5客户端握手

上一篇说到ss-libev创建listen_ctx_t对象用于监听客户端连接,调用accept_cb处理来自客户端的新连接,创建server_t对象用于处理和客户端之间的交互。本篇分析来自客户端的SOCK5连接的建立以及传输数据的过程。 首先,回忆一下使用new_server()函数创建server_t对象时,注册了客户端连接的读写事件的回调:ev_io_init(&server->recv_ct...
阅读(1237) 评论(0)
219条 共15页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:667650次
    • 积分:8935
    • 等级:
    • 排名:第2326名
    • 原创:207篇
    • 转载:12篇
    • 译文:0篇
    • 评论:332条
    博主链接
    最新评论
    同道中人