UDP怎么会返回Connection refused错误

作者&投稿:刁征 (若有异议请与网页底部的电邮联系)
UDP怎么会返回Connection refused错误~

有时候,写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和对端关联的任何信息,因此也就无法找到一个特定的五元组将错误码传给它。
以下是一个测试程序:

#include
#include
#include
#include
#include
#include
#include
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调用就无法捕获这些错误。

看一下网络连接上没有,如果连接好了就看一下把防火墙,查毒软件之类关掉试一下,不行再重新下载一个不要用迅雷下载,用浏览器自带的下载工具下载

有时候,写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和对端关联的任何信息,因此也就无法找到一个特定的五元组将错误码传给它。
以下是一个测试程序:

#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调用就无法捕获这些错误。


医学名词翻译 急!!!
SBP-RI : 肾损害 SBP : Spontaneous bacterial peritonitis | 特殊沸点 | DBP:邻苯二甲酸二丁酯(DBP)主要用作纤维素树脂和聚氯乙烯的主增塑剂,特别适用于硝酸纤维素涂料.具有优良的溶解性,分解性和粘着性,漆膜的柔软性和稳定性.本品还可作为天然橡胶的增塑剂,软化剂,可提高制品的回弹性. dp---...

“SD”是什么意思
会员限定:里的VIP会员才可以购买的娃,一般都是DP娃的多套装版和DP娃的改装版,有的时候需要抽取,曾经有一只专门为会员造型的SD.这类娃的情报一般只能在会员刊上见到,以邮寄回执参与抽取的方式在里抽取. 志上限定:购买相关杂志并邮寄回执,抽取购买的孩子. 官方站点: http:\/\/www.volks.co.jp http:\/\/www.super...

...对角线AC、BD交于点O,Q是CD上任意一点,DP⊥AQ,交BC于点P.求证:(1...
(1)在△DCP和△ADQ中,AD=CD,∠DCP=∠ADQ,∠DQM+∠PDC=90°,∠DQM+∠DAQ=90°,∴∠PDC=∠QAD,∴△DCP≌△ADQ,∴DQ=CP.(2)在△OQD和△OPC中,CP=QD,∠OCP=∠ODQ,DO=CO,∴△OPC≌△OQD,∴∠POC=∠QOD,∵∠QOD+∠QOC=90°∴∠POC+∠QOC=∠POQ=90°,即OQ⊥OP.

如图,在正方形abcd中,对角线ac,bd相交于点o,q是cd上任意一点,dp...
设垂线交点为k 则三角形ADQ中,角DAQ+角DQA=90 三角形DQK中,角DQK+角KDQ=90 所以,角DAQ=角KDQ,然后就像楼上所说可证明三角形ADQ和PCD全等.(2)因为DQ=PC,则三角形OPC与ODQ全等,角DOQ=角COP 因为角DOQ+角QOC=90 所以角QOC+角COP=90,所以OQ垂直于OP 希望对你有帮助 ...

关于一般产地证的问题就是CO,产地证上有提单日期,就是船期,
不会影响客户提货的,因为ÇO到国外后客户及对方海关等政府机构只能看到产地证纸面上显示的信息,而看不到你申请时传输给商检局或贸促会的更多电子信息,因为无论是商检局或贸促会都没有和国外进出口主管机构联网!所以请楼主放心即可,既然正本没显示就100%没问题的 ...

codp点对运营管理的指导意义
codp点对运营管理的指导意义是顾客需求切入点。在延迟制造中,推式流程与拉式流程的分界点,它是供应链中产品的生产从基于预测转向回响客户需求的转折点。

商业英语麻烦您翻译--把缩写也告诉我最好
13。我们抱歉说我们不能答应你 DP 支付条款。14。我们能同意你的住所是付款交单将被接受如果为每宗交易包含的数量不依赖美国 $ ……15。如果你保证担心的买主的可靠性,我们将接受 60 天付款交单。16。我们同意在 3 装运接受商品,你可以从每装运的日期在 60 白天的视力在我们上绘画。17。当我们...

...轴的正半轴上且坐标为(4,O),△ODC是以CO为斜边的等腰直角三角_百度...
(1) ; (2) (1)过D做DP⊥x轴于P,因为△ODC是以OC为斜边的等腰直角三角形,所以D(2,2),因为D在y=k\/x上,所以k=4,即y=4\/x。 (2)若B为双曲线上的一点,且B的横坐标为1,则B(1,4)把△ OAB沿OB对折,A落到A′位置,设AA′交OB于N,则△A′OB≡△AOB,OA=...

SD娃娃是怎么来的?
会员限定:里的VIP会员才可以购买的娃,一般都是DP娃的多套装版和DP娃的改装版,有的时候需要抽取,曾经有一只专门为会员造型的SD.这类娃的情报一般只能在会员刊上见到,以邮寄回执参与抽取的方式在里抽取. 志上限定:购买相关杂志并邮寄回执,抽取购买的孩子. 官方站点: http:\/\/www.volks.co.jp http:\/\/www....

AB是圆O的直径,C是半圆上的一动点,CD⊥AB,连接CO,CP平分∠OCD,P点的...
P点不变化 证明:连接OP DP,因为OP=OC,所以角OCP=角OPC,又角OCP=角DCP 所以角OPC=角DCP 所以OP平行CD 又CD垂直于AB,所以OP垂直于AB 而P点在圆上,所以始终有OP垂直于AB,P是定点。

爱辉区18538344214: UDP怎么会返回Connection refused错误 -
宜师银翘: 有时候,写UDP socket程序的时候,在调用sendto或者recvfrom的时候,会发现有Connection refused错误返回,错误码是ECONNREFUSED.对于懂得socket接口但是不很很懂网络的人,可能这根本就不是个问题,他会根据错误码知道远端没...

爱辉区18538344214: 为什么会提示Connection refused啊该怎么处理 -
宜师银翘: 这是被占用了端口,重启电脑就可以了

爱辉区18538344214: c#udp connect 后需要关闭吗 -
宜师银翘: UDP是无连接协议,不必先调用 Connect 即可发送和接收数据.虽然.net在程序退出时会自行处理未关闭的Socket,但是,好的习惯是:你在退出程序前用Close()关闭Socket,

爱辉区18538344214: Unable to get a connectio 怎么解决 -
宜师银翘: 你好!Unable to get a connection 无法连接

爱辉区18538344214: 通过在传输层使用 udp 与服务器建立通信时,客户端将执行哪个操作 -
宜师银翘: 面向TCP连接的socket通信程序: 服务端:创建套接字,指定协议族(sockaddr_in),绑定,监听(listen),接受链接(accept),发送或接收数据;客户端:创建套接字,指定协议族,连接,发送或接收数据 这几个步骤都是必须的. 补充...

爱辉区18538344214: 怎么会一上线 等一会就会弹出UDP连接失败啊?
宜师银翘: 最简单的办法,重新启动机器按F8,进入安全模式,把系统还原的到最初始的数据就可以了,这个原因是因为你用杀毒软件屏蔽了一些端口,执行过屏蔽操作以后数据就写入注册表,如果没做任何裸系统备份,很难返回,唯一的办法就是让系统还原到没有装任何杀毒防御的情况下,建议先装杀毒软件,然后在装应用软件,注意装完杀毒软件切记不可做任何优化和限制端口操作,否则还会出现类似问题.

爱辉区18538344214: 为什么会提示Connection refused -
宜师银翘: 看看什么样的connection,需要什么条件和限制,你的是否都满足了 如口令,和认证等

爱辉区18538344214: 为什么UDP会连接失败
宜师银翘: 近期部分玩家反映在游戏中出现“UDP连接失败,若继续出现相同错误,请咨询官方网站”的提示,该问题是由于防火墙的拦截率过高导致. 为了技术人员能更好地检测防火墙对UDP数据包的拦截,请各位玩家提供您所使用的防火墙名称和版本号,感谢您的支持. 同时,如出现此类的提示,建议您在游戏过程中暂时关闭防火墙和杀毒软件,给您带来的不便,敬请谅解,谢谢.

爱辉区18538344214: UDP无法连接 -
宜师银翘: UDP协议 有如下 的特点:1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步.2、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息(如TCP所采用的序号),而且报文不一定按顺序到达的,所以接收端无从排起.3、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据.4、UDP传送数据较TCP快速,系统开销也少.从以上特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网