socketitunes 100544你是怎么解决的,能说下不?

6147人阅读
网络编程学习整理
http://blog.csdn.net/cctt_1/article/details/4512103
python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。问题解决方案:
前几天使用python读取网页。因为对一个网站大量的使用urlopen操作,所以会被那个网站认定为攻击行为。有时就不再允许下载。导致urlopen()后,request.read()一直卡死在那里。最后会抛出errno 10054.
这个错误是connection reset by peer.也就是传说的远端主机重置了此连接。原因可能是socket超时时间过长;也可能是request = urllib.request.urlopen(url)之后,没有进行request.close()操作;也可能是没有sleep几秒,导致网站认定这种行为是攻击。
具体解决方案如下面的代码:
import&socket&&import&time&&timeout&=&20&&&&socket.setdefaulttimeout(timeout)&&sleep_download_time&=&10&&time.sleep(sleep_download_time)&&&request&=&urllib.request.urlopen(url)&&content&=&request.read()&&request.close()&&
因为urlopen之后的read()操作其实是调用了socket层的某些函数。所以设置socket缺省超时时间,就可以让网络自己断掉。不必在read()处一直等待。
当然你也可以再外层再写几个try,except,例如:
try:&&&&&&time.sleep(self.sleep_download_time)&&&&&&request&=&urllib.request.urlopen(url)&&&&&&content&=&request.read()&&&&&&request.close()&&&&&&&&except&UnicodeDecodeError&as&e:&&&&&&&&&&&&&&&print('-----UnicodeDecodeError&url:',url)&&&&&&&&except&urllib.error.URLError&as&e:&&&&&&print(&-----urlError&url:&,url)&&&&except&socket.timeout&as&e:&&&&&&print(&-----socket&timout:&,url)&&
一般来说就莫有问题了。我测试了几千个网页的下载,然后才说出此话。不过如果是下载成千上万的,我做了下测试,ms还是会跳出这个异常。可能是time.sleep()的时间太短,也可能是网络突然中断。我使用urllib.request.retrieve()测试了一下,发现不停的下载数据,总会有失败的情况出现。
简单的处理方法是:首先参照的我的文章:。先做一个检查点。然后将以上会跑出异常的那段代码while True一下。参见下面的伪代码:
def&Download_auto(downloadlist,fun,sleep_time=15):&&&&&&while&True:&&&&&&&&&&&&&&&&&&try:&#&外包一层try&&&&&&&&&&&&&&&value&=&fun(downloadlist,sleep_time)&#&这里的fun是你的下载函数,我当函数指针传进来。&&&&&&&&&&&&&#&只有正常执行方能退出。&&&&&&&&&&&&&&if&value&==&Util.SUCCESS:&&&&&&&&&&&&&&&&&&break&&&&&&&&&&except&:&#&如果发生了10054或者IOError或者XXXError&&&&&&&&&&&&&&sleep_time&+=&5&#多睡5秒,重新执行以上的download.因为做了检查点的缘故,上面的程序会从抛出异常的地方继续执行。防止了因为网络连接不稳定带来的程序中断。&&&&&&&&&&&&&&print('enlarge&sleep&time:',sleep_time)&&
不过对于找不到相应的网页,又要做另外的一番处理:
#&打印下载信息&&def&reporthook(blocks_read,&block_size,&total_size):&&&&&&if&not&blocks_read:&&&&&&&&&&print&('Connection&opened')&&&&&&if&total_size&&&0:&&&&&&&&&&print&('Read&%d&blocks'&%&blocks_read)&&&&&&else:&&&&&&&&&&#&如果找不到,页面不存在,可能totalsize就是0,不能计算百分比&&&&&&&&&&print('downloading:%d&MB,&totalsize:%d&MB'&%&(blocks_read*block_size/,total_size/))&&&&&&&&&&&&def&Download(path,url):&&#url&=&'http://downloads.sourceforge.net/sourceforge/alliancep2p/Alliance-v1.0.6.jar'&&&&&&#filename&=&url.rsplit(&/&)[-1]&&&&&&try:&&&&&&#&python自带的下载函数&&&&&&&&&&urllib.request.urlretrieve(url,&path,&reporthook)&&&&&&except&IOError&as&e:&#&如果找不到,好像会引发IOError。&&&&&&&&&&print(&download&&,url,&/nerror:&,e)&&&&&&print(&Done:%s/nCopy&to:%s&&%(url,path))&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:24218次
排名:千里之外
原创:11篇
评论:10条
(1)(3)(13)socket error 究竟是怎么引起的
socket error 究竟是怎么引起的
贴2段能稳定重现10053的代码,下面是客户端:
WORD&&&&VersionR&&
WSADATA&WsaD&&
VersionRequested&=&MAKEWORD(2,&2);&&
if&(WSAStartup(VersionRequested,&&WsaData))&&
&&&&return&-1;&&
SOCKET&SocketServer&&=&socket(AF_INET,&SOCK_STREAM,&IPPROTO_TCP);&&
SOCKADDR_IN&AddrS&&
AddrServer.sin_addr.S_un.S_addr&=&inet_addr("127.0.0.1");&&
AddrServer.sin_port&&&&&&&&&&&&&=&htons(9999);&&
AddrServer.sin_family&&&&&&&&&&&=&AF_INET;&&
//&连接服务器 &&
if&(0&!=&connect(SocketServer,&(SOCKADDR&*)&AddrServer,&sizeof(SOCKADDR)))&&
&&&&closesocket(SocketServer);&&
&&&&return&false;&&
int&err&=&0;&&
char&temp[]&=&"hello,&server";&&
int&rs&=&send(SocketServer,&temp,&sizeof(temp)&+&1,&0);&&
char&buff[1024]&=&{0};&&
rs&=&recv(SocketServer,&buff,&sizeof(buff),&0);&&
&&&&&&&//&下面这2句代码如果注释掉,后面的recv就能正解的返回0。如果不注释掉,recv就会返回-1, &&
&&&&&&&&//&并得到10053这个错误 &&
rs&=&send(SocketServer,&temp,&sizeof(temp)&+&1,&0);&&
err&=&WSAGetLastError();&&
rs&=&recv(SocketServer,&buff,&sizeof(buff),&0);&&
err&=&WSAGetLastError();&&
system("pause");&&
return&0;&&这个是服务器的:
WORD&&&&VersionR&&
WSADATA&WsaD&&
VersionRequested&=&MAKEWORD(2,&2);&&
if&(WSAStartup(VersionRequested,&&WsaData))&&
&&&&printf("加载socket库失败!\n");&&
&&&&return&-1;&&
//&监听来自浏览器的请求 &&
SOCKET&SockServer&=&socket(AF_INET,&SOCK_STREAM,&IPPROTO_TCP);&&
SOCKADDR_IN&AddrC&&
AddrClient.sin_family&&&&&&=&AF_INET;&&
AddrClient.sin_addr.s_addr&=&INADDR_ANY;&&
AddrClient.sin_port&&&&&&&&=&htons(9999);&&
if&(SockServer&==&INVALID_SOCKET)&&
&&&&printf("socket初始化失败!\n");&&
&&&&closesocket(SockServer);&&
&&&&WSACleanup();&&
&&&&return&-1;&&
if&(bind(SockServer,&(sockaddr*)&AddrClient,&sizeof(AddrClient))&!=&0)&&
&&&&printf("socket绑定失败!\n");&&
&&&&closesocket(SockServer);&&
&&&&WSACleanup();&&
&&&&return&-1;&&
if&(listen(SockServer,&10)&!=&0)&&
&&&&printf("socket监听失败!\n");&&
&&&&closesocket(SockServer);&&
&&&&WSACleanup();&&
&&&&return&-1;&&
while&(1)&&
&&&&SOCKET&NewSocket&=&accept(SockServer,&NULL,&NULL);&&
&&&&if&(INVALID_SOCKET&==&NewSocket)&&
&&&&&&&&closesocket(NewSocket);&&
&&&&&&&&continue;&&
&&&&else&&
&&&&&&&&struct&linger&so_&&
&&&&&&&&so_linger.l_onoff&&=&1;&&
&&&&&&&&so_linger.l_linger&=&30;&&
&&&&&&&&setsockopt(NewSocket&,SOL_SOCKET,&SO_LINGER,&(const&char*)&so_linger,&sizeof(so_linger));&&&
&&&&char&buff[1024];&&
&&&&int&rs&=&recv(NewSocket,&buff,&sizeof(buff),&0);&&
&&&&char&temp[]&=&"hello,&client";&&
&&&&rs&=&send(NewSocket,&temp,&sizeof(temp)&+&1,&0);&&
&&&&closesocket(NewSocket);&&
}&&10053里说的software在我的例子中指的就是那个send函数吗,是send函数执行的时候,发现对方的套接字已经关闭了,所以它把己方的套接字也关掉了吗,然后导致后续的recv报错10053?
出现10053的原因是因为在你执行这次send的时候对端已经执行过closesocket了,而发送的数据还是被成功的推入了发送缓冲区中,因此返回了0,此时你可能还没得到FIN消息,而紧接着recv这边就得到了对端关闭socket的FIN消息,因此此时需要放弃发送缓冲中的数据,异常终止连接,所以得到了10053错误:您的主机中的软件中止了一个已建立的连接。&而为什么又能得到10054的错误号,原因应该在于你设置了SO_LINGER了,一但设置了它,则有一个等待时间,在该等待时间内可以处理发送缓冲区的数据,一但超时或者发送缓冲都被发送完并被确认,则服务端有可能发送RST消息而不是FIN,此时就应该得到重置错误,也就是10054。不同的系统对SO_LINGER的实现方式不一样,得到的结果也不一样,不知道按我这样解释是否对你有帮助。如果我有理解错误,欢迎大家指正。
socket error- Software caused connection abort. Error code : 10053
Action.c(16): Error : socket0 - Software caused connection abort. Error code : 10053.
10053这个错误,产生于socket通讯过程中,通常是这么回事:正常的C/S通讯过程是:
Server Close
如果Client端不主动关闭连接而直接退出,则Server端的服务线程会引发一个10053错误(这种错误通常影响不太大), 而如果通讯过程中Server首先主动关闭连接,则Client端也会引发一个10053错误
网络不好的时候的情况通常是指后者,Client以为Server关了(实际是网络断了), 所以就大叫10053
发表评论:
TA的最新馆藏欢迎访问蓝队网络一站式平台!
关注蓝队网络
您的位置:
ftp连接出现socket错误=#10054的解决方法
发布时间:&&&&&浏览量:512人
上一篇:下一篇:
最新发布的内容
大家感兴趣的内容
QQ在线咨询
服务时间:9:00 - 17:30
选择对应客服在线沟通:
您可能遇到了下面的问题:
400专线7x24小时全时响应
技术在线支持
服务时间:9:00 - 24:00
选择对应技术在线沟通:
您可能遇到了下面的问题:
400专线7x24小时全时响应
网站ICP备案咨询
服务时间:9:00 - 17:30
选择对应客服在线沟通:
您可能遇到了下面的问题:
400专线7x24小时全时响应如何处理socket10054错误_百度知道
如何处理socket10054错误
提问者采纳
10054.其他防火墙的设置也是如此flashfxp出现“Socket 错误。如果你安装了别的防火墙就把windows自带的防火墙关掉。或者在windows的防火墙的例外中添加ftp的端口21: 连接被重置”,一般是因为windows防火前的问题
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 itunes 10054 的文章

 

随机推荐