gen_tcp接收缓冲区易混淆概念纠正
原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: gen_tcp接收缓冲区易混淆概念纠正
Erlang的每个TCP网络链接是由相应的gen_tcp对象来表示的,说白了就是个port, 实现Erlang网络相关的逻辑,其实现代码位于erts/emulator/drivers/common/inet_drv.c
参照inet:setopts文档,它有三个buffer相关的选项,非常让人费解:
{buffer, Size}
Determines the size of the user-level software buffer used by the driver. Not to be confused with sndbuf and recbuf options which correspond to the kernel socket buffers. It is recommended to have val(buffer) >= max(val(sndbuf),val(recbuf)). In fact, the val(buffer) is automatically set to the above maximum when sndbuf or recbuf values are set.{recbuf, Size}
Gives the size of the receive buffer to use for the socket.{sndbuf, Size}
Gives the size of the send buffer to use for the socket.
其中sndbuf, recbuf选项比较好理解, 就是设置gen_tcp所拥有的socket句柄的内核的发送和接收缓冲区,从代码可以验证:
/* inet_drv.c */ #define INET_OPT_SNDBUF 6 /* set send buffer size */ #define INET_OPT_RCVBUF 7 /* set receive buffer size */ static int inet_set_opts(inet_descriptor* desc, char* ptr, int len) { ... case INET_OPT_SNDBUF: type = SO_SNDBUF; DEBUGF(("inet_set_opts(%ld): s=%d, SO_SNDBUF=%d\r\n", (long)desc->port, desc->s, ival)); break; case INET_OPT_RCVBUF: type = SO_RCVBUF; DEBUGF(("inet_set_opts(%ld): s=%d, SO_RCVBUF=%d\r\n", (long)desc->port, desc->s, ival)); break; ... res = sock_setopt (desc->s, proto, type, arg_ptr, arg_sz); ... }
那buffer是什么呢,他们三者之间的关系? 从文档的描述来看:
It is recommended to have val(buffer) >= max(val(sndbuf),val(recbuf)). In fact, the val(buffer) is automatically set to the above maximum when sndbuf or recbuf values are set.
Read more…
Post Footer automatically generated by wp-posturl plugin for wordpress.
Recent Comments