当前位置: 建站>运营/SEO
本页文章导读:
▪UDP怎么会返回Connection refused错误 有时候,写UDP socket程序的时候,在调用sendto或者recvfrom的时候,会发现有Connection refused错误返回,错误码是ECONNREFUSED。对于懂得socket接口但是不很很懂网络的人,可能这根本就不是个问题,他.........
▪RedHat Linux下QStarDict的安装 QStarDict是Qt版的翻译软件,类似于StarDict星际译王。
软件下载链接:http://download.csdn.net/detail/wentasy/5827039
.........
▪清理 Windows installer 目录 清理 Windows installer 目录
清理 Windows installer 目录,通常情况下是不必要的。那我为什么要去清理 Windows installer 目录呢?
事情是这样的:
这是一台.........
[1]UDP怎么会返回Connection refused错误
来源: 互联网 发布时间: 2013-10-31
有时候,写UDP socket程序的时候,在调用sendto或者recvfrom的时候,会发现有Connection refused错误返回,错误码是ECONNREFUSED。对于懂得socket接口但是不很很懂网络的人,可能这根本就不是个问题,他会根据错误码知道远端没有这个服务端口,正如socket api的man手册中描述的那样:
ECONNREFUSED
A remote host refused to allow the network connection (typically because it is not running the requested service).
有时候无知真的是一种幸福!但是如果你十分精通TCP/IP栈,那么就想不通了,UDP既然无连接,怎么知道远端的情况呢?UDP不正如协议标准描述的那样,发出去就不管了吗?对于接收,没有数据就一直等,如果设置了NOWAIT,则直接返回EAGAIN,表示稍后再试。不管怎么说,也不会有ECONNREFUSED这么详细的信息返回才对啊。
既然UDP不会从对端返回任何错误信息,那么一定有别的什么返回了,总不能凭空猜测啊。这就涉及到了网络协议设计中的数据平面和控制平面了,对于控制平面的消息,可以是带内传输,也可以是带外传输。对于TCP而言,无疑是带内传输的,因为它本身就是有连接的协议,协议本身会处理任何的错误和异常,然而对于UDP而言,因为其设计目的就是保持简单性,故不再附带有任何带内的控制消息逻辑,互联网上为了弥补这一类协议的控制逻辑的缺失,ICMP协议才显得尤为重要!实际上,ICMP,根据名称就可以看出它是一种专门的控制协议,控制和指示IP层发生的事件。
ECONNREFUSED正是ICMP返回的!然而并不是所有的UDP socket都可以享用ICMP带来的错误提示,毕竟带外控制消息和协议本身的关联太松散了。UDP socket必须显式的connect对端才可以。现在问题又来了,既然UDP根本就是一个无连接的协议,connect的意义何在呢?这其实是socket接口设计的范畴,和协议本身没有任何关系,当一个UDP socket去connect一个远端时,并没有发送任何的数据包,其效果仅仅是在本地建立了一个五元组映射,对应到一个对端,该映射的作用正是为了和UDP带外的ICMP控制通道捆绑在一起,使得UDP socket的接口含义更加丰满。
我们知道,ICMP错误信息返回时,ICMP的包内容就是出错的那个原始数据包,根据这个原始数据包可以找出一个五元组,根据该五元组就可以对应到一个本地的connect过的UDP socket,进而把错误消息传输给该socket,应用程序在调用socket接口函数的时候,就可以得到该错误消息。如果一个UDP socket没有调用过connect,那么即使有ICMP数据包返回,由于socket保持了UDP的完整语义,协议栈也就不保存关于该socket和对端关联的任何信息,因此也就无法找到一个特定的五元组将错误码传给它。
以下是一个测试程序:
ICMP 192.168.1.20 udp port 12345 unreachable, length 40
接下来第二个sendto返回:
write: Connection refused
由于第二次没有发送任何数据包到达192.168.1.20,所以也不能企望它返回ICMP错误信息,因此接下来的recvfrom调用会阻塞。
最后的一个问题时,你不能太指望这个Connection refused以及一切带外返回的错误信息,因为你不能保证一定能收到远端发送的ICMP包,如果中间的某个节点或者本机禁掉了ICMP,socket api调用就无法捕获这些错误。
ECONNREFUSED
A remote host refused to allow the network connection (typically because it is not running the requested service).
有时候无知真的是一种幸福!但是如果你十分精通TCP/IP栈,那么就想不通了,UDP既然无连接,怎么知道远端的情况呢?UDP不正如协议标准描述的那样,发出去就不管了吗?对于接收,没有数据就一直等,如果设置了NOWAIT,则直接返回EAGAIN,表示稍后再试。不管怎么说,也不会有ECONNREFUSED这么详细的信息返回才对啊。
既然UDP不会从对端返回任何错误信息,那么一定有别的什么返回了,总不能凭空猜测啊。这就涉及到了网络协议设计中的数据平面和控制平面了,对于控制平面的消息,可以是带内传输,也可以是带外传输。对于TCP而言,无疑是带内传输的,因为它本身就是有连接的协议,协议本身会处理任何的错误和异常,然而对于UDP而言,因为其设计目的就是保持简单性,故不再附带有任何带内的控制消息逻辑,互联网上为了弥补这一类协议的控制逻辑的缺失,ICMP协议才显得尤为重要!实际上,ICMP,根据名称就可以看出它是一种专门的控制协议,控制和指示IP层发生的事件。
ECONNREFUSED正是ICMP返回的!然而并不是所有的UDP socket都可以享用ICMP带来的错误提示,毕竟带外控制消息和协议本身的关联太松散了。UDP socket必须显式的connect对端才可以。现在问题又来了,既然UDP根本就是一个无连接的协议,connect的意义何在呢?这其实是socket接口设计的范畴,和协议本身没有任何关系,当一个UDP socket去connect一个远端时,并没有发送任何的数据包,其效果仅仅是在本地建立了一个五元组映射,对应到一个对端,该映射的作用正是为了和UDP带外的ICMP控制通道捆绑在一起,使得UDP socket的接口含义更加丰满。
我们知道,ICMP错误信息返回时,ICMP的包内容就是出错的那个原始数据包,根据这个原始数据包可以找出一个五元组,根据该五元组就可以对应到一个本地的connect过的UDP socket,进而把错误消息传输给该socket,应用程序在调用socket接口函数的时候,就可以得到该错误消息。如果一个UDP socket没有调用过connect,那么即使有ICMP数据包返回,由于socket保持了UDP的完整语义,协议栈也就不保存关于该socket和对端关联的任何信息,因此也就无法找到一个特定的五元组将错误码传给它。
以下是一个测试程序:
#include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> void test( int sd, struct sockaddr *addr, socklen_t len) { char buf[4]; connect(sd, (struct sockaddr *)addr, len); sendto(sd, buf, 4, 0, (struct sockaddr *)addr, len); perror("write"); sendto(sd, buf, 4, 0, (struct sockaddr *)addr, len); perror("write"); recvfrom(sd, buf, 4, 0, (struct sockaddr *)addr, len); perror("read"); } int main(int argc, char **argv) { int sd; struct sockaddr_in addr; if(argc != 2) { exit(1); } bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(12345); inet_pton(AF_INET, argv[1], &addr.sin_addr); sd = socket(AF_INET, SOCK_DGRAM, 0); test(sd, (struct sockaddr *)&addr, sizeof(addr)); return 0; }编译为UDPclient,执行./UDPclient 192.168.1.20,注意,这个地址一定要是个IP可达的地址,才好测试。按照上面的理论,结果应该是:第一个sendto成功,然后192.168.1.20返回了:
ICMP 192.168.1.20 udp port 12345 unreachable, length 40
接下来第二个sendto返回:
write: Connection refused
由于第二次没有发送任何数据包到达192.168.1.20,所以也不能企望它返回ICMP错误信息,因此接下来的recvfrom调用会阻塞。
最后的一个问题时,你不能太指望这个Connection refused以及一切带外返回的错误信息,因为你不能保证一定能收到远端发送的ICMP包,如果中间的某个节点或者本机禁掉了ICMP,socket api调用就无法捕获这些错误。
作者:dog250 发表于2013-7-28 21:26:23 原文链接
阅读:46 评论:0 查看评论
[2]RedHat Linux下QStarDict的安装
来源: 互联网 发布时间: 2013-10-31
QStarDict是Qt版的翻译软件,类似于StarDict星际译王。
软件下载链接:http://download.csdn.net/detail/wentasy/5827039
一 安装:
[root@zhink stardict]# rpm -ivh qstardict-0.13.1-3.el6.x86_64.rpm warning: qstardict-0.13.1-3.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY Preparing... ########################################### [100%] 1:qstardict ########################################### [100%]
二 创建目录:
[root@zhink stardict]# mkdir /usr/share/stardict
三 拷贝词库到刚创建的目录
[root@zhink stardict]# cp dic /usr/share/stardict/ -rf
四 在应用程序里找到QStarDict,输入单词可以查询或者屏幕取词。
@Wentasy 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。原创博文如需转载请注明出处,谢谢 :) [CSDN博客]
我的邮箱:wgbno27@163.com 新浪微博:@Wentasy27 微信公众平台:JustOracle(微信号:justoracle) 数据库技术交流群:336882565(加群时验证 From CSDN XXX) Oracle交流讨论组:https://groups.google.com/d/forum/justoracle By Larry Wen
作者:Wentasy 发表于2013-7-28 9:30:42 原文链接
阅读:109 评论:0 查看评论
[3]清理 Windows installer 目录
来源: 互联网 发布时间: 2013-10-31
清理 Windows installer 目录
清理 Windows installer 目录,通常情况下是不必要的。那我为什么要去清理 Windows installer 目录呢?
事情是这样的:
这是一台虚拟机,原先是运行在 Virtual Server,后来升级到 Hyper-V。这时,就要升级虚拟机的插件。但是,怎么也装不上去,总是提示说已经安装了 Virtual Machine Additions,要先卸载,再安装。实际上,已经卸载了。
一查, Windows installer 目录下居然有 50G,肯定是有问题了。但是,直接删除会造成正常的程序无法卸载。
下载 Windows installer 目录清理工具,运行,它会删除重复的文件。之后,只有 1.X G 了。
再升级插件,就可以了。
清理 Windows installer 目录,通常情况下是不必要的。那我为什么要去清理 Windows installer 目录呢?
事情是这样的:
这是一台虚拟机,原先是运行在 Virtual Server,后来升级到 Hyper-V。这时,就要升级虚拟机的插件。但是,怎么也装不上去,总是提示说已经安装了 Virtual Machine Additions,要先卸载,再安装。实际上,已经卸载了。
一查, Windows installer 目录下居然有 50G,肯定是有问题了。但是,直接删除会造成正常的程序无法卸载。
下载 Windows installer 目录清理工具,运行,它会删除重复的文件。之后,只有 1.X G 了。
再升级插件,就可以了。
作者:hadstj 发表于2013-7-28 10:38:57 原文链接
阅读:9 评论:0 查看评论
最新技术文章: