关闭
当前搜索:

[go] Socket创建之后,listen/connect之前无法执行操作?

使用go的net库去创建一个tcp客户端连接,使用net.Dial就行,问题是Dial返回的是一个创建好且连接上的connection。如果需要在连接之前对socket做一些操作,就不行了。 比如这个问题: https://github.com/golang/go/issues/21820#issue-256441130 这兄弟是在android上面,需要对socket进行一个“protec...
阅读(37) 评论(0)

使用nc & pv测试发送速度

最近写了一个用于测试网络速度的发包工具,再工具发布之前,我使用nc配合pv对工具进行了测试,即确认工具发送的数据流量和nc/pv接收到的是一致的,确认工具是按设定参数发送数据。先说一下发送数据的工具的工作原理 对于TCP,参数为每次写入的数据块的大小,以及数据块的数量,比如每次写入1M,共发送1000个,这样就发送了1G的数据。工具是服务端,收到客户端的任意数据后开始发送,所以可以配合nc使用,只要...
阅读(140) 评论(0)

TCP理论带宽计算

TCP理论上的有效带宽计算(即每秒可以传输多少负载数据) 以千兆网为例,首先要明确千兆网的速度为1000Mbps,即每秒可传输1000M个bit,且这儿1M = 1000 K = 1000000。那么千兆网的速度就是125MB/s,即每秒传输125000000个字节。(如果按MiB计算,就是119MiB/s) 在TCP/IP网络,一般使用以太网传输,在以太网中传输的是以太网帧。而TCP段是封装在IP...
阅读(72) 评论(0)

go语言的类型断言(Type Assertion)

x.(T) 检查x的动态类型是否是T,其中x必须是接口值。 * 如果T是具体类型 类型断言检查x的动态类型是否等于具体类型T。如果检查成功,类型断言返回的结果是x的动态值,其类型是T。换句话说,对接口值x断言其动态类型是具体类型T,若成功则提取出x的具体值。如果检查失败则panic。 例如:var w io.Writer w = os.Stdout //os.Stdout是一个类型为*os....
阅读(120) 评论(0)

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...
阅读(371) 评论(0)

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

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

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

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

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

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

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

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

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

最近在项目中使用了libev,遇到一个很奇怪的crash,服务器运行随机时间后有一定的概率奔溃,输出的最后一行log是: (libev) cannot allocate xxx bytes, aborting。 因为捕捉了SIGINT信号,所以可以确定崩溃就是由于libev的这个abort。开始是以为内存越界之类,排查了strncpy, memset,memcpy等使用的地方,并且使用valgr...
阅读(435) 评论(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...
阅读(1477) 评论(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的,处理...
阅读(817) 评论(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执行到,所...
阅读(725) 评论(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返回上...
阅读(1717) 评论(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...
阅读(688) 评论(0)
223条 共15页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:696008次
    • 积分:9212
    • 等级:
    • 排名:第2328名
    • 原创:211篇
    • 转载:12篇
    • 译文:0篇
    • 评论:339条
    博主链接
    最新评论
    同道中人