Windows下UDP连接被重置错误10054

合集下载

socket error 10053,10054究竟是怎么引起的

socket error 10053,10054究竟是怎么引起的

贴2段能稳定重现10053的代码,下面是客户端:[cpp]view plaincopy1.WORD VersionRequested;2.WSADATA WsaData;3.4.VersionRequested = MAKEWORD(2, 2);5.6.if (WSAStartup(VersionRequested, &WsaData))7.return -1;8.9.SOCKET SocketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);10.SOCKADDR_IN AddrServer;11.AddrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");12.AddrServer.sin_port = htons(9999);13.AddrServer.sin_family = AF_INET;14.15.// 连接服务器16.if (0 != connect(SocketServer, (SOCKADDR *)&AddrServer, sizeof(SOCKADDR)))17.{18. closesocket(SocketServer);19.return false;20.}21.22.int err = 0;23.char temp[] = "hello, server";24.int rs = send(SocketServer, temp, sizeof(temp) + 1, 0);25.26.char buff[1024] = {0};27.rs = recv(SocketServer, buff, sizeof(buff), 0);28.29.// 下面这2句代码如果注释掉,后面的recv就能正解的返回0。

如果不注释掉,recv就会返回-1,30.// 并得到10053这个错误31.rs = send(SocketServer, temp, sizeof(temp) + 1, 0);32.err = WSAGetLastError();33.34.rs = recv(SocketServer, buff, sizeof(buff), 0);35.err = WSAGetLastError();36.37.system("pause");38.return 0;这个是服务器的:[cpp]view plaincopy1.WORD VersionRequested;2.WSADATA WsaData;3.4.VersionRequested = MAKEWORD(2, 2);5.6.if (WSAStartup(VersionRequested, &WsaData))7.{8. printf("加载socket库失败!\n");9.return -1;10.}11.12.// 监听来自浏览器的请求13.SOCKET SockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);14.SOCKADDR_IN AddrClient;15.AddrClient.sin_family = AF_INET;16.AddrClient.sin_addr.s_addr = INADDR_ANY;17.AddrClient.sin_port = htons(9999);18.19.if (SockServer == INVALID_SOCKET)20.{21. printf("socket初始化失败!\n");22. closesocket(SockServer);23. WSACleanup();24.return -1;25.}26.27.if (bind(SockServer, (sockaddr*)&AddrClient, sizeof(AddrClient)) != 0)28.{29. printf("socket绑定失败!\n");30. closesocket(SockServer);31. WSACleanup();32.return -1;33.}34.35.if (listen(SockServer, 10) != 0)36.{37. printf("socket监听失败!\n");38. closesocket(SockServer);39. WSACleanup();40.return -1;41.}42.43.while (1)44.{45. SOCKET NewSocket = accept(SockServer, NULL, NULL);46.if (INVALID_SOCKET == NewSocket)47. {48. closesocket(NewSocket);49.continue;50. }51.else52. {53.struct linger so_linger;54. so_linger.l_onoff = 1;55. so_linger.l_linger = 30;56. setsockopt(NewSocket ,SOL_SOCKET, SO_LINGER, (const char*)&so_linger, sizeof(so_linger));57. }58.59.char buff[1024];60.int rs = recv(NewSocket, buff, sizeof(buff), 0);61.62.char temp[] = "hello, client";63. rs = send(NewSocket, temp, sizeof(temp) + 1, 0);64.65. closesocket(NewSocket);66.}10053里说的software在我的例子中指的就是那个send函数吗,是send函数执行的时候,发现对方的套接字已经关闭了,所以它把己方的套接字也关掉了吗,然后导致后续的recv 报错10053?出现10053的原因是因为在你执行这次send的时候对端已经执行过closesocket了,而发送的数据还是被成功的推入了发送缓冲区中,因此返回了0,此时你可能还没得到FIN消息,而紧接着recv这边就得到了对端关闭socket的FIN消息,因此此时需要放弃发送缓冲中的数据,异常终止连接,所以得到了10053错误:您的主机中的软件中止了一个已建立的连接。

网络编程错误返回代码

网络编程错误返回代码
〖10050〗-套接字操作遇到了一个已死的网络。
〖10051〗-向一个无法连接的网络尝试了一个套接字操作。
〖10052〗-当该操作在进行中,由于保持活动的操作检测到一个故障,该连接中断。
〖10053〗-您的主机中的软件放弃了一个已建立的连接。
〖10054〗-远程主机强迫关闭了一个现有的连接。
〖11018〗-无效的 QOS 提供程序特定缓冲区。
〖11019〗-使用了无效的 QOS 筛选器样式。
〖11020〗-使用了无效的 QOS 筛选器类型。
〖11021〗-FLOWDESCRIPTOR 中指定的 QOS FILTERSPEC 数量不正确。
〖10071〗-项目在本地不可用。
〖10091〗-因为它使用提供网络服务的系统目前无效,WSAStartup 目前不能正常工作。
〖10092〗-不支持请求的 Windows 套接字版本
〖10093〗-应用程序没有调用 WSAStartup,或者 WSAStartup 失败。
〖10101〗-由 WSARecv 或 WSARecvFrom 返回表示远程方面已经开始了关闭步骤。
〖10055〗-由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。
〖10056〗-在一个已经连接的套接字上做了一个连接请求。
〖10057〗-由于套接字没有连接并且 (当使用一个 sendto 调用发送数据报套接字时) 没有提供地址,发送或接收数据的请求没有被接受。
〖10058〗-由于以前的关闭调用,套接字在那个方向已经关闭,发送或接收数据的请求没有被接受。
〖10059〗-对某个内核对象的引用过多。
〖10060〗-由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败。

FlashFXP错误代码10054:连接被同位体重置等问题的解决方案

FlashFXP错误代码10054:连接被同位体重置等问题的解决方案

FlashFXP错误代码10054:连接被同位体重置等问题的解决方案由于工作需要,要搭建一个ftp,服务端软件选择了filezilla,客户端默认指定的是flashfxp。

选择了局域网内的一台机器作为ftp服务器,用户分为内网用户和外网用户。

情况如下:ftp服务器所在机器内网ip: 192.168.1.10 外网ip: 202.188.192.5内网用户user1的机器ip: 192.168.1.21(与ftp同属一个内网,其对应的外网Ip是202.188.192.5)外网用户user2的机器ip: 202.188.190.2(注:由于政策和相关法规,文中所有ip地址均不是作者配置的实际ip地址,但是与作者配置的ip地址是等价的)去网上搜索了filezilla的基本教程。

并按照基本流程配置下来。

主要配置如下:1、安装完成filezilla之后,新建用户,并选择对应的ftp目录和权限就可以了,很简单。

另外就是进行系统配置,点击工具栏中的系统配置图标,进入系统配置菜单(FileZilla Server Options)。

首页是最基本的东西,比如端口,最大用户数,超时时间等。

参考配置如下。

2、很多教程都说需要使用被动模式,因此设置Passive mode settings这个版块,勾选其中的Use custom port range,将范围设置为10001到10050。

还说如果外网的用户要连接这个ftp的话,需要在下面的IPv4 specific栏目中勾选Use the following IP,并填上ftp所在机器的外网ip,如果是咱们的例子就是202.188.192.5。

但是请注意!!!在之后的实践中,我发现可以不用这么做,这个栏目只勾选Default就可以。

如下图:以往的教程设置Use the following IP的目的是为了让外网的机器能够通过IP地址找到这台ftp服务器的机器。

我们可以这样设置,但是也可以进行另外一项更加保险的设置,将会在下文提出。

利用netsh,winsock,reset,命令修复网络应用错误

利用netsh,winsock,reset,命令修复网络应用错误

利用 netsh,winsock,reset,命令修复网络应用错误 篇一:重置 winsock netsh winsock reset winsock 是 Windows 网络编程接口,winsock 工作在应用层,它提供与底层传输协议无关 的高层数据传输编程接口 netsh winsock reset 是把它恢复到默认状态 中文名 重置 Winsock 目录 外文名 ResettingWinsockCatalogue 目录 1 简介 2 重置 Winsock 3 为 Windows Vista 重置 Winsock 4 为 Windows 7 用户重置 Winsock 5WINSOCK 各种修复方法 1 简介 netsh winsock reset 命令,作用是重置 Winsock 目录。

如果一台机器上的 Winsock 协议 配置有问题的话将会导致网络连接等问题,就需要用 netsh winsock reset 命令来重置 Winsock 目录借以恢复网络。

这个命令可以重新初始化网络环境,以解决由于软件冲突、病毒原因造成 的参数错误问题。

netsh 是一个能够通过命令行操作几乎所有网络相关设置的接口,比如设置 IP,DNS,网卡,无线网络等,Winsock 是系统内部目录,Winsock 是 Windows 网络编程接口, winsock 工作在应用层,它提供与底层传输协议无关的高层数据传输编程接口, reset 是对 Winsock 的重置操作。

当执行完 winsock 的命令重启计算机后,需要重新配置 IP。

2 重置 Winsock 要为 Windows XP 重置 Winsock,请按照下列步骤操作: 1.单击“开始”,运行中输入 cmd。

2.然后输入命令 netsh winsock reset。

3.重启计算机。

3 为 Windows Vista 重置 Winsock 要为 Windows Vista 重置 Winsock,请按照下列步骤操作: 1.单击“开始”,在开始搜索框中键入 cmd,右键单击“,单击“以管理员身份运行”,然后按 “继续”。

电脑网络配置错误如何解决并恢复连接

电脑网络配置错误如何解决并恢复连接

电脑网络配置错误如何解决并恢复连接作为一个追求高效工作和畅快娱乐的现代人,网络连接对于我们来说非常重要。

然而,在使用电脑的过程中,我们有时会遇到网络配置错误的问题,这给我们的生活带来了很多不便。

那么,该如何解决这些问题并恢复无缝的网络连接呢?一、检查物理连接首先,我们需要检查网络线缆和插头是否连接稳固。

将网线从电脑和路由器上分别拔下来,再重新插入,确保插头紧密无松动。

如果使用的是无线网络,需要检查路由器是否开启,信号是否正常。

这一步操作能够排除物理连接故障导致的网络问题。

二、重启设备当我们遇到网络配置错误问题时,重启设备是解决问题的最简单而有效的方法之一。

关闭电脑和路由器,等待几分钟后再重新开启它们。

通过这样的操作,可以清除缓存,消除暂时性的网络故障。

三、检查网络设置若重启后问题仍未解决,我们需要检查网络设置是否正确。

在电脑桌面右下角的网络图标上点击右键,选择“打开网络和共享中心”,进入网络设置界面。

确认网络类型是否为“公共”或“专用”网络,检查IP地址、默认网关、DNS服务器等设置是否正确。

对于无线网络,还需检查是否连接了正确的SSID并输入了正确的密码。

四、更新驱动程序网络配置错误有时是由于网络驱动程序过时或损坏导致的。

我们可以通过以下步骤来更新驱动程序:1. 打开“设备管理器”:在开始菜单搜索栏中输入“设备管理器”,点击打开。

2. 找到网络适配器:在设备管理器界面中,找到“网络适配器”选项,展开其选项。

3. 更新驱动程序:右键点击网络适配器,选择“更新驱动程序”,然后选择自动更新或手动指定驱动程序。

4. 重新启动设备:完成驱动程序更新后,重新启动电脑,检查网络连接是否恢复正常。

五、重置网络设置如果以上方法仍然无法解决网络配置错误问题,我们可以尝试重置网络设置。

以下是具体步骤:1. 打开命令提示符:在开始菜单搜索栏中输入“命令提示符”,点击打开。

2. 执行重置命令:在命令提示符界面中,输入“netsh winsock reset”并按下Enter键执行命令。

SOCKET错误代码表

SOCKET错误代码表

WSAEWOULDBLOCK (10035) 函式作用阻攔中
WSAETIMEDOUT (10060) Connection timed out
WSAHOST_NOT_FOUND (11001) Host not found
WSASYSNOTREADY (10091) Network sub-system is unavailable
WSANOTINITIALISED (10093) WSAStartup() not performed
Socket error 10050 - Network is down
Socket error 10051 - Network is unreachable
Socket error 10052 - Network dropped connection on reset
Socket error 10053 - Software caused connection abort
Socket error 10037 - Operation already in progress
Socket error 10038 - Socket operation on non-socket
Socket error 10039 - Destination address required
getstockname()
沒有呼叫bind()函式指定socket名稱
listen()
已經處於連接狀態或是socket沒有呼叫bind()函式指定socket名稱
recv()和recvfrom()
對於datagram socket,socket沒有呼叫bind()函式指定IP位址、port和協定等;對於stream socket,連接尚未建立

Windows下UDP连接被重置错误10054

Windows下UDP连接被重置错误10054现象:在Windows 7系统上,A使用UDP socket,调用sendto函数向一个目标地址B发送数据,但是目标地址B没有接收数据,如果A此时立即调用recvfrom 试图接收目标地址B发回的数据的话,recvfrom会立即返回-1,WSAGetLastError()返回10045。

原因:上述现象是Windows socket的一个bug,当UDP Socket在某次发送后收到一个不可到达的ICMP包时,这个错误将在下一个接收中返回,所以上面的套接字在下一次的接收中返回了SOCKET_ERROR,错误是10054。

解决办法:使用WSAIoctl设置UDP socket的工作模式,让其忽略这个错误。

具体做法如下:#include <Winsock2.h>#include <Mstcpip.h>#include <stdio.h>#pragma comment(lib, "ws2_32.lib")#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR, 12)BOOL bNewBehavior = FALSE;DWORD dwBytesReturned = 0;WSAIoctl(iSock, SIO_UDP_CONNRESET, &bNewBehavior, sizeof bNewBehavior, NULL, 0, &dwBytesReturned, NULL, NULL);SIO_UDP_CONNREST选项:Controls whether UDP PORT_UNREACHABLE messages are reported. Set to TRUE to enable reporting. Set to FALSE to disable reporting.备注:setsockopt是修改套接口的属性,只是该套接口在工作的过程中需要用到的一些参数;WSAIoctl则是修改套接口的工作模式,更多的定义了这个套接口要以怎样的形式进行工作,有本质的区别。

FlashFXP错误代码10054:连接被同位体重置等问题的解决方案

这段时间由于工作需要,要搭建一个ftp,服务端软件选择了filezilla,客户端默认指定的是flashfxp。

选择了局域网内的一台机器作为ftp服务器,用户分为内网用户和外网用户。

情况如下:ftp服务器所在机器内网ip: 192.168.1.10 外网ip: 202.188.192.5内网用户user1的机器ip: 192.168.1.21(与ftp同属一个内网,其对应的外网Ip是202.188.192.5)外网用户user2的机器ip: 202.188.190.2(注:由于政策和相关法规,文中所有ip地址均不是作者配置的实际ip地址,但是与作者配置的ip地址是等价的)去网上搜索了filezilla的基本教程。

并按照基本流程配置下来。

主要配置如下:1、安装完成filezilla之后,新建用户,并选择对应的ftp目录和权限就可以了,很简单。

另外就是进行系统配置,点击工具栏中的系统配置图标,进入系统配置菜单(FileZilla Server Options)。

首页是最基本的东西,比如端口,最大用户数,超时时间等。

参考配置如下。

2、很多教程都说需要使用被动模式,因此设置Passive mode settings这个版块,勾选其中的Use custom port range,将范围设置为10001到10050。

还说如果外网的用户要连接这个ftp的话,需要在下面的IPv4 specific栏目中勾选Use the following IP,并填上ftp所在机器的外网ip,如果是咱们的例子就是202.188.192.5。

但是请注意!!!在之后的实践中,我发现可以不用这么做,这个栏目只勾选Default就可以。

如下图:以往的教程设置Use the following IP的目的是为了让外网的机器能够通过IP地址找到这台ftp服务器的机器。

我们可以这样设置,但是也可以进行另外一项更加保险的设置,将会在下文提出。

FTP工具Socket error = #10054的解决方法

235.
Socket error = #10054的解决方法
cuteftp最近一段时间传东西上去的时候老出现Socket 错误 = #10054.我查阅了一些资料,发现出现同一个问题的不少.但是我出现的情况是只有某个小于2M的特定文件传不上某些个服务器.我先是怀疑2003 sp2的问题,所以先卸载了其中的一台机器的sp2,依然.改变传输模式依然不能完全解决.后来找到了一个方法,把发送缓冲(SEND BUFFER)从默认的64k降低到2k,问题解决.
這裡需要特別注意的是,一般這種情況可以先在命令行中使用FTP命令進行測試,如果可以使用FTP命令,那麼只需要修改傳輸模式即可。

Windows Sockets 错误码及出错原因

WSAEMSGSIZE
EMSGSIZE
10040
同BSD
WSAEPROTOTYPE
EPROTOTYPE
10041
同BSD
WSAENOPROTOOPT
ENOPROTOOPT
10042
同BSD
WSAEPROTONOSUPPORT
EPROTONOSUPPORT
10043
同BSD
WSAESOCKTNOSUPPORT
NO_RECOVERY
11003
同BSD
WSANO_DATA
NO_DATA
11004
同BSD
A.2Windows Sockets错误码扩展描述
下面给出WSAGetLastError()函数返回的可能错误码按字母顺序排列的列表,同时给出简要的扩展描述。
WSAEACCES (10013) Permission denied.
WSAEDESTADDRREQ (10039) Destination address required.
在套接字上一个操作所必须的地址被遗漏。例如,如果sendto()函数被调用且远程地址为ADDR_ANY时,此错误被返回。
WSAEFAULT (10014) Bad address.
系统检测到调用试图使用的一个指针参数指向的是一个非法指针地址。如果应用程序传递一个非法的指针值,或缓冲区长度太小,此错误发生。例如,参数为结构sockaddr,但参数的长度小于sizeof(struct sockaddr)。
试图和一个不可达主机进行套接字操作。参见WSAENETUNREACH。
WSAEINPROGRESS (10036) Operation now in progress.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这个错误一般是使用UDP Socket接受时收到(这里我不讲具体的语言了,不管你用C#、Python还是C,在Windows下都会有类似的问题,只要你调用类似ReceiveFrom 函数)。

这是上一次Send操作向一个地址发送,但是那个地址没有Socket监听(例如对等体崩溃),那么ICMP控制协议会向我们发送一个Port Unreachable错误,当然这个错误应该包含对方的详细地址等信息,但是Winsock把这个错误转化为Connection Reset,在你下一次调用读操作的时候,引发异常,却没把详细信息给你——例如用C#接受到的对方地址是0.0.0.0。

而这个问题最要命的是,如果你不采取措施,每次调用读操作都会引发该异常!唯一恢复正常的办法就是把Socket关掉,重开。

这就非常要命:你要实现一个UDP服务器,把收到的音频发给所有的客户,如果某个客户崩溃了或者网络不好,你的Send不会出问题,但是你Receive的时候却出了问题!好吧,你捕获了异常,重新Receive,还是异常!好吧,你关掉Socket重新建立,但是因为不知道是哪个客户出了问题,所以不能及时把他的地址从发送列表里去除(即使使用心跳检测也要等几秒种),下次Send还是这样,你就不停地关闭创建Socket,谁受的了?
网络上的讨论,最后要么说这是一个bug,要么使用如下代码(以C#为例)
const int SIP_UDP_CONNRESET=-1744830452;
socket.IOControl(SIP_UDP_CONNRESET, new byte[] {0, 0, 0, 0}, null); 设置这个选项忽略那个Reset错误,这样不用重建Socket,只不过每次Socket都会向一些已经关闭的客户发包,浪费了服务器资源;只能通过其他机制确定客户端已经断开,延迟一段时间后才能确定哪个客户端出问题。

假设AB两台计算机通讯,如果两台计算机都具有
公网ip,比如都是ADSL拨号,那么两计算机之间没有NAT网关,可以直接通讯。

如果AB计算机有任意一台或两台都是通过宽带路由器一类的NAT网关上网,则两计算机间存在NAT网关。

假设由其中一台发出一个UDP包,包内含有自己的地址192.168.2.1端口1234,当这个包穿过NAT网关时,网关会创建一个临时会话,包内的地址被NAT网关修改为公网IP及随
机分配的端口。

既然不能知道对方临时获得的在网关上的端口,UDP会话也就无法建立,这需要增加一台拥有固定公网IP的服务器来解决。

例如QQ在传送文件或语音对话时,有2种模式,服务器中转和UDP/TCP直连,服务器中转比较简单,两端都登录到服务器上,由服务器转发消息即可。

直连实现大概方式如下:
当A登陆到服务器,服务器获得A的地址在NAT设备上临时分配的端口,然后当B登陆后,就可以查询到A的地址端口并可以发出消息给A,同样A也可以查询并连接上B,直连建立。

如果没有服务器,则需要在NAT设备上映射固定的端口,且需要知道对方的公网IP,才能实现直连。

端口映射及NAT穿透可以在网上搜索,相关资料也比较多。

相关文档
最新文档