WSAGetLastError可能会返?/span>10053错误Q查msdn的解释是Q?/span>
WSAECONNABORTED 10053
马QY件原因造成的连接中断,q是什么意思,不跟没说一L么? Berkeley description: A connection abort was caused internal to your host machine. The software caused a connection abort because there is no space on the socket’s queue and the socket cannot receive further connections.
WinSock description: Partly the same as Berkeley. The error can occur when the local network system aborts a connection. This would occur if WinSock aborts an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket).
TCP/IP scenario: A connection will timeout if the local system doesn’t receive an (ACK)nowledgement for data sent. It would also timeout if a (FIN)ish TCP packet is not ACK’d (and even if the FIN is ACK’d, it will eventually timeout if a FIN is not returned).
伯克利说q种q接中断是因为宿L器的内部原因Q因Y件导致的q接中断Q可能是因ؓsocket的队列满q且q个socket不能接收更多的连接了?br /> q还不如不说Q越说越p涂了?br /> winsocket的描qͼgq靠׃些,q种错误一般发生在一个徏立的q接被重发失败的情况下生,接收Ҏ有响应数据发回来。但q是比较模糊?br /> 再看看tcp ip标准文档的说法,如果本地pȝ没有收到发送数据的响应QackQ那么这q接׃时。如果tcp的fin包没有被ackQ或者fin包被ack了但fin没有q回Q那么也会超时。但是,但是Q超时跟q个10053有神马关p? The Scenario: Meanwhile, the client is still happily writing the remainder of the HTTP request to the socket. (Remember a TCP/IP socket connection needs to be closed from both sides. In this case, the server has closed its side, but the client is still pumping data into the half-open connection.) Go back and re-read the original error explanations. Hopefully, after that explanation, you’ll say "Aha! I understand what they’re talking about!".
啊哈Q又有http了,大概意思就是http server收到h了,但发现有问题Q那么回一个http错误码,然后关闭了socketQ但与此同时Qclient端还在很开心地向socket写数据,注意哦,tcp是全双工的。client写完毕后Q实际上数据只是攑ֈ了发送方的缓冲区中,不一定已l发出去了,如果写得不好的程序,q个时候就开始从socketL据了Q这时候就会生一个WSACONNECTABORTED错误Qwindows上对应的是10053错误?/span> 但这个解释实际上是不能让人满意的Q只是DZ一U场景,但ؓ什么会产生q没有解释。后面又搜到了个参?Q首先解?0053错误是收到fin后client会放弃发送缓冲区中的数据Q同时上报错误。虽然说法还有点一头雾水?/span> 不过q两个参考给我们一个思\Q重现这个问题?/span> 于是单写个测试用的c-sE序Q大概流E如?/span>
? CSE序化流E图 q个单程序演C如何出?0053错误Q以?0054错误Q?/span> 如果server在收到client发送的数据后立卛_闭socketQ那么client再读Ӟ会收?0053错误Q如果server收到发送数据后Q立即crashQ那么随后client再读取时会收?0054错误?/span> okQ能够重现场景了Q那么我们来分析一下更l节的方面,|络问题自然是抓包,本问题处理抓包还要看一下tcp的状态以便辅助分析,我们在client端每ơ操作之前都打印当前的tcp状态?/span> 下面是client端发送记录和对应的netstat情况
client在发送之前tcp状态是establishedQ在发送之后,server会立卛_闭,tcp状态也变ؓclose_waitQ但q只是单方向的关闭,client可以l箋发数据,但client发送后Qserver立即退ZQ导致后lrecv会失败ƈ且返?0053。对应抓包情况如下: ? 10053错误client端tcp抓包 整个通信q程如下Q?br /> 1-3.三次握手建立q接
? 10054错误client端tcp状态流?/span> 可以看到在crash之前q个tcp都是established状态。crash之后Qclient端接收数据时会收?0054错误Q场景重CQ我们再看一下抓包情?/span> ? 10054错误client端tcp抓包 q个抓包情况?0053很像Q?-7也同10053Q在8Ӟclient收到server发过来的resetQ表C当前连接被强制复位了?br /> Ҏ10053?0054可以发现Q如果srvq回fin标志后再reset那么对应的错误就?0053Q如果直接reset是10054错误。回q头来在看参?中的说法也就有点感觉了?br /> 7.回过头来在看一开始的解释Q所谓Y件原因造成的连接终端,是本例子中Qserver端在shoutdown本方向传输时Q立卛_闭了socketQ导致本应该{待Ҏ发送fin来完全结束的正常逻辑被打_~程单方向强制中止本ơtcpQ导致client端之后向上报错,是所谓的10053错误了,q里的Y件就是server端的那个E序。(不过也有U说法是Q客L发送错误数据,Dserver端保护机制而强制关闭)
| |
|
There is a problem with $ERL_TOP/erts/configure not passing the LDFLAGS
environment variable for test compiles, so ALL library tests fail. I
modified files $ERL_TOP/erts/aclocal.m4 and $ERL_TOP/configure.in in order
to locate pthread_create in the standard C runtime library. The
$ERL_TOP/configure.in produces a configure that works, wheras the
$ERL_TOP/erts/configure.in does not. At the top of file erts/configure.in:
AC_PREREQ(2.13)
AC_INIT(vsn.mk)
应该是一些curses库没有安装,但apt-get install curses提示找不刎ͼgoogle了一下发现需要安?br />ncurses-devel包,在网上只扑ֈ了相应的rpm包,使用alien命oQ将rpm保{换ؓdeb包安装:
sudo apt-get install alien
sudo alien *.rpm,转成deb后,用dpkg -i *.deb
或?br />sudo alien -i *.rpm
q行安装
(注意Q下载rpm包的时候我包改名了,Dalien时出错,Ҏ原来的名字就正常了,不知道ؓ什么:P)
q时候cofigure可以q去了,但make又出错了Q提Cerlc找不刎ͼcM如下的错误信息:
erlc -W +debug_info -I../include -o../ebin otp_ring0.erl
make[4]: erlc: Command not found
make[4]: ***[../ebin/otp_ring0.beam]Error127
make[4]: Leaving directory `/usr/src/packages/erlang-10.b.5/lib/kernel/src'
make[3]: *** [/usr/src/packages/erlang-10.b.5/lib/kernel/ebin/otp_ring0.beam] Error 2
make[3]: Leaving directory `/usr/src/packages/erlang-10.b.5/erts/emulator'
make[2]: *** [generate] Error 2
make[2]: Leaving directory `/usr/src/packages/erlang-10.b.5/erts/emulator'
make[1]: *** [depend] Error 2
make[1]: Leaving directory `/usr/src/packages/erlang-10.b.5'
make: *** [build-stamp] Error 2
make: *** [debs] Error 2
看网上有介绍说用make cleanq不完全Q?br />于是源码删除,重新解压~,再configure后,makeQ没有提Cerlc找不CQ又有提C类似如下的错误信息Q?br />> otp_src_R11B-1/lib/kernel/ebin/erlang.beam > i686-pc-linux-gnu/preload.c
> m4 -DTARGET=i686-pc-linux-gnu -DOPSYS=linux -DARCH=x86 hipe/
> hipe_x86_asm.m4 > i686-pc-linux-gnu/opt/plain/hipe_x86_asm.h
> /bin/sh: m4: command not found
> make[2]: *** [i686-pc-linux-gnu/opt/plain/hipe_x86_asm.h] Error 127
> make[2]: Leaving directory `/home/jhancock/otp_src_R11B-1/erts/emulator'
> make[1]: *** [generate] Error 2
> make[1]: Leaving directory `/home/jhancock/otp_src_R11B-1/erts/emulator'
> make: *** [depend] Error 2
q是m4包没有找刎ͼhttp://www.erlang.org/pipermail/erlang-questions/2006-November/023942.htmlQ?br />安装m4包后Qlmake出现如下错误Q?br />hipe/hipe_mkliterals.c:351: error: 'X86_LEAF_WORDS' undeclared here (not in a function)
hipe/hipe_mkliterals.c:352: error: 'X86_NR_ARG_REGS' undeclared here (not in a function)
|上搜烦l果Qhttp://forum.trapexit.org/viewtopic.php?t=6815
源码删除,再解压羃 再makel于q去?/pre>提示Q如下的包最好是在erlang安装之前安装好? perl, debhelper (>= 4.0.0), autoconf (>= 2.50), openssl, libssl-dev, m4, libncurses5-dev, dpatch, autotools-dev, unixodbc-dev
makeq程大概?个小Ӟ之后是make install很快?br />打开l端Q输入erlQ出现提C符1>
后面yaws的安装和使用
yaws的安装挺单的Q主要是他的~译是基于erlang的?br />需要注意的是,安装好后Q如果没有安装相应的ssl模块的话Q需要更改一下conf文gQ将其中关于ssl的部分注释掉Q既如下部分Q?br /><server xxx>
....
<ssl>
...
</ssl>
</server>
在windows下的安装Q在yaws的主上有说明,需要下载一个bat文gQ不q这个文件好像有问题Q需要将一些安装的环境变量改一下,在(SET ERLC_FLAGS=Q这行之后添加:
SET ProgramFiles=G:\erlang\yaws\yaws_program
SET HOME=G:\erlang\yaws\yaws_data
SET APPDATA=G:\erlang\yaws\yaws_configure
ProgramFiles 为yaws的程序位|,HOME为yaws的数据位|,包括wwwQlogQwikiQssl{,APPDATA为yaws的配|位|?br />如果使用默认安装参数的话Q需要将IF NOT DEFINED ProgramFiles SET ProgramFiles="c:\Program Files"?br />HOME="%HOMEDRIVE%%HOMEPATH%\My Documents"中的双引号去掉(感觉q个bat文g写的比较乱)
同时不要忘了Q在安装好之后注释掉conf文g中关于ssl的部分?br />安装好后Q默认就可以?home/www目录或?tmpQwindows下ؓ%home%\www or C:\tmpQ目录添加yaws文gQehtmlQ来昄了?br />btwQ如果在ubuntu or debian上安装,最单,只要apt-get install yaws 可以了。运行yaws需要root权限?br />Long Long Ago 2007-01-18 23:22 发表评论]]>