GetLastError和wsagetlasterror 0的区别

WSAGetLastError返回的可能错误代码
WSAGetLastError (Wsapiref_2tiq.asp) 函数返回了可能的错误代码。 错误错误宏按字母顺序列出。
不从任何函数返回在 Winsock2.h 中定义一些错误代码。 本文中不包括这些错误代码。
更多信息WSAEINTR (10004) 翻译: 中断函数调用。 说明: A 阻塞操作已被
WSACancelBlockingCall (Wsapiref_704y.a...WSAEINTR (10004)
翻译: 中断函数调用。
说明: A 阻塞操作已被 WSACancelBlockingCall (Wsapiref_704y.asp) 调用中断。
WSAEACCES (10013)
翻译: 权限被拒绝。
说明: 访问被禁止通过其访问权限的方式套接字的尝试。 渚嬪广播的地址用于 sendto 但通过使用
setsockopt(SO_BROADCAST) 未设置广播的权限时,将发生此错误。 WSAEACCES
错误的另一个可能原因是,当绑定 (Wsapiref_6vzm.asp) 函数被调用时 (在 Microsoft Windows NT
4.0 Service Pack 4 [SP4] 或更高版本),另一个程序、 服务,或内核模式驱动程序绑定到相同的地址以独占访问权限。
这样的独占访问权限是一种新的功能的 Windows NT 4.0 SP4 和更高版本中,和实现通过使用
SO_EXCLUSIVEADDRUSE 选项。
WSAEFAULT (10014)
翻译: 错误地址。
说明: 尝试使用指针参数的调用时,系统检测到无效指针地址。 如果某个程序通过无效指针值,或如果缓冲区的长度太小,则会发生此错误。
渚嬪如果小于 sizeof(SOCKADDR) 值的参数是 SOCKADDR 结构的长度,则会出现此问题。
WSAEINVAL (10022)
翻译: 参数无效。
说明: 向 setsockopt (Wsapiref_94aa.asp) 函数提供了无效的参数 (渚嬪指定无效的级别的参数)。
有时,还指套接字的当前状态、 电话渚嬪没有侦听的套接字上接受 (Wsapiref_13aq.asp)。
WSAEMFILE (10024)
翻译: 打开的文件太多。
说明: 有太多打开的套接字。 每个实现可能具有可用的套接字句柄的最大数量。 这些句柄可能可用的全局,每进程,或每个线程。
WSAEWOULDBLOCK (10035)
翻译: 资源暂时不可用。
说明: 此错误从无法立即完成,渚嬪的非阻止套接字上的操作 (Wsapiref_2i9e.asp) 接收时返回无数据排队从套接字读取。
它是一个非严重的错误和操作可以在稍后重试。 WSAEWOULDBLOCK 通常被报告为结果的电话连接
(Wsapiref_8m7m.asp) 非阻止 SOCK_STREAM 套接字上,因为对于建立该连接必须经过一些时间。
WSAEINPROGRESS (10036)
翻译: 现在正在进行的操作。
说明: 当前正在运行的阻止操作。 Windows 套接字只允许一个阻塞操作为每个任务或为每个线程是未完成。 如果任何其他函数调用
(无论它引用的或任何其他套接字),函数失败,WSAEINPROGRESS 错误。
WSAEALREADY (10037)
翻译: 已在进行的操作。
说明: 一个操作,在操作正在进行时尝试对非阻止套接字。 渚嬪电话连接
(Wsapiref_8m7m.asp),在第二次尝试对非阻止套接字已连接的或异步请求
(WSAAsyncGetXbyY),在尝试已经已被取消或完成的。
WSAENOTSOCK (10038)
翻译: 套接字上 nonsocket 的操作。
说明: 上某些内容不是一套接字已尝试的操作。 套接字的句柄参数没有引用一个有效套接字,或者选择
(Wsapiref_1ab6.asp),为一个 fd_set 的成员已无效。
WSAEDESTADDRREQ (10039)
翻译: 所需的目标地址。
说明: 从上一个套接字的操作省略了一个必需的地址。 渚嬪 sendto (Wsapiref_4sqa.asp) 调用使用
ADDR_ANY 的远程地址,则返回此错误。
WSAEMSGSIZE (10040)
翻译: 消息太长。
说明: 数据文报套接字发送的邮件已大于内部消息缓冲区或某些其他网络限制或用于接收数据报的缓冲区比数据报本身小。
WSAEPROTOTYPE (10041)
翻译: 协议套接字的类型错误。
说明: 套接字 (Wsapiref_2qr6.asp) 函数调用中指定的协议不支持请求的套接字类型的语义。 渚嬪 ARPA
Internet UDP 协议不能指定与 SOCK_STREAM 的套接字类型。
WSAENOPROTOOPT (10042)
翻译: 错误协议选项。
说明: getsockopt (Wsapiref_8qcy.asp) 调用或 setsockopt
(Wsapiref_94aa.asp) 调用中指定了一个未知、 无效,或不受支持的选项或级别。
WSAEPROTONOSUPPORT (10043)
翻译: 不支持的协议。
说明: 请求的协议未要么被配置为在系统中或它的实现不存在。 渚嬪套接字 (Wsapiref_2qr6.asp) 调用请求
SOCK_DGRAM 套接字,但它指定流协议。
WSAESOCKTNOSUPPORT (10044)
翻译: 套接字类型不受支持。
说明: 这个地址家族中不存在指定的套接字类型的支持。 套渚嬪可选类型可能在套接字 (Wsapiref_2qr6.asp)
调用中被选中,但实现不支持 SOCK_RAW SOCK_RAW 接字根本。
WSAEOPNOTSUPP (10045)
翻译: 不支持的操作。
说明: 被引用的对象类型不支持所尝试的操作。
此错误通常在一个套接字描述符到不支持此操作,一套接字试图接受连接数据报套接字上的时发生。
WSAEPFNOSUPPORT (10046)
翻译: 协议家族不受支持。
说明: 尚未在系统中配置的协议族或它的实现不存在。 此邮件有 WSAEAFNOSUPPORT 含义略有不同。 但是,它是经常可互换的。
返回一个这些消息的所有 Windows 套接字函数还都指定 WSAEAFNOSUPPORT。
WSAEAFNOSUPPORT (10047)
翻译: 地址族不支持的协议族。
说明: 使用了地址与请求的协议不兼容。 与一个相关联的地址族 (也就是 AF_INET 的 Internet 协议) 和泛型的协议类型
(SOCK_STREAM) 创建所有的套接字。 如果不正确的协议明确请求的套接字 (Wsapiref_2qr6.asp)
调用中,或不正确的家族的地址用于一个插槽渚嬪 sendto (Wsapiref_4sqa.asp) 中,将返回此错误。
WSAEADDRINUSE (10048)
翻译: 已在使用中的地址。
说明: 通常,允许的每个套接字地址 (协议/IP 地址/端口) 只有一个用法。 如果某个程序试图将绑定
(Wsapiref_6vzm.asp) 为 IP
地址或端口已被使用的一个现有插槽未正确,关闭一个套接字的套接字,会发生此错误,或仍在结束的过程是一套接字。
已将多个套接字绑定到相同的端口号的服务器程序应考虑使用 setsockopt
(Wsapiref_94aa.asp)(SO_REUSEADDR)。 客户端程序通常不具有在所有调用绑定、 连接
(Wsapiref_8m7m.asp) 自动选择未使用的端口。 当一个绑定调用使用通配符地址 (涉及 ADDR_ANY)
时,直到特定地址被提交,可能会延迟 WSAEADDRINUSE 错误。 这可能会出现与发生更高版本,包括连接、 侦听、
WSAConnect,或 WSAJoinLeaf 的另一个函数调用。
WSAEADDRNOTAVAIL (10049)
转换: 无法分配请求的地址。
说明: 请求的地址是其上下文中的无效。 此错误通常结果从试图绑定 (Wsapiref_6vzm.asp)
到不在本地计算机的无效的地址。 此错误也可能会导致从连接 (Wsapiref_8m7m.asp) sendto
(Wsapiref_4sqa.asp) WSAConnect (Wsapiref_8kc2.asp)、 WSAJoinLeaf
(Wsapiref_7dv6.asp) 或 WSASendTo (Wsapiref_752q.asp)
时远程地址或端口是无效的远程计算机 (for example,地址或端口 0)。
WSAENETDOWN (10050)
翻译: 网络已关闭。
说明: 一个套接字操作遇到死网络。 此错误可能表示网络系统 (也就是协议堆栈运行的 Windows 套接字 DLL 的)、
网络接口或本地网络本身的严重故障。
WSAENETUNREACH (10051)
转换: 无法访问网络时。
说明: 一个套接字操作试图无法访问网络。 此错误通常意味着本地软件知道没有到达远程主机的路由。
WSAENETRESET (10052)
翻译: 网络上重置丢弃连接。
说明: 由于在操作过程中检测到失败时的 keep-alive 活动的连接被中断。 它还返回由 setsockopt
(Wsapiref_94aa.asp) 如果尝试已失败的连接上设置 SO_KEEPALIVE。
WSAECONNABORTED (10053)
翻译: 软件造成连接中断。
说明: 一个已建立的连接已停止,软件在您的宿主计算机中可能是因数据传输超时或协议错误。
WSAECONNRESET (10054)
翻译: 通过对等方重置连接。
说明: 一个现有的连接被远程主机强行关闭。 如果突然停止对等程序在远程主机上的、
重新启动主机,或远程主机将使用硬盘关闭,通常会发生此错误。 有关远程套接字上 SO_LINGER 选项的详细信息,请参阅
setsockopt (Wsapiref_94aa.asp)。 如果因一个或多个操作正在进行时检测到失败时的 keep-alive
活动连接被中断,也可能会导致此错误。 正在进行的操作失败,出现 WSAENETRESET。 随后的操作失败,出现
WSAECONNRESET。
WSAENOBUFS (10055)
翻译: 没有可用的缓冲空间。
说明: 由于系统缺乏足够的缓冲区空间,或因为队列已满,不能执行套接字的操作。
WSAEISCONN (10056)
翻译: 套接字已连接。
说明: 一个已连接套接字上发出的连接请求。 某些实现还此如果调用返回错误 sendto (Wsapiref_4sqa.asp)
是已连接的 SOCK_DGRAM 套接字上 (对于 sendto (Wsapiref_4sqa.asp) 中收件人参数上的
SOCK_STREAM 套接字将被忽略) 尽管其他实现将此视为有效的匹配项。
WSAENOTCONN (10057)
翻译: 套接字未连接。
说明: 不允许发送或接收数据的请求,因为套接字未连接且 (当使用 sendto [Wsapiref_4sqa.asp]
数据文报套接字上发送,已提供没有地址)。 任何其他类型的操作也可能会返回此错误中 setsockopt
(Wsapiref_94aa.asp) 如果连接重置设置 SO_KEEPALIVE 的示例。
WSAESHUTDOWN (10058)
翻译: 套接字关闭后无法发送。
说明: 由于套接字有已被关闭,因此在与以前的关闭 (Wsapiref_60z6.asp) 调用该方向,不允许发送或接收数据的请求。
当调用一个关机时,套接字的分部关闭请求。 这是一个信号,发送或接收进程 (或两者) 已经被中止。
WSAETIMEDOUT (10060)
翻译: 连接超时。
说明: 由于连接的方没有正确响应时间,一段时间后或建立的连接失败,因为连接的主机未能响应的连接尝试失败。
WSAECONNREFUSED (10061)
翻译: 连接被拒绝。
说明: 进行未连接,因为目标计算机主动拒绝它。
尝试连接到处于非活动状态外主机就是一个不具有运行服务器程序上的服务通常会导致此错误。
WSAEHOSTDOWN (10064)
翻译: 主机已关闭。
说明: 一个套接字操作失败,因为目标主机已关闭。 套接字操作遇到死的主机。 不初始化本地主机上的网络活动。 这些条件就是由错误
WSAETIMEDOUT 指示的可能性更大。
WSAEHOSTUNREACH (10065)
翻译: 没有到主机的路由。
说明: 无法连接主机已尝试的套接字操作。 请参阅 WSAENETUNREACH。
WSAEPROCLIM (10067)
翻译: 太多的进程。
说明: 一个 Windows 套接字实现可能可以同时使用它的程序数目上有限制。 如果达到限制 WSAStartup
(Wsapiref_1v8y.asp) 可能会失败,此错误。
WSASYSNOTREADY (10091)
翻译: 网络子系统不可用。
说明: 如果 Windows 套接字实现当前无法正常工作,因为它用来提供网络服务的基础系统当前不可用,则通过 WSAStartup
(Wsapiref_1v8y.asp) 返回此错误。 确认下列事项:
确认当前路径中相应的 Windows 套接字 DLL 文件。
确认它们不尝试在同一时间使用多个 Windows 套接字实现。
如果有多个) Winsock DLL 在系统上,确认适当网络子系统当前加载的第一个的 Winsock DLL,在路径中。
请确认所有必需的组件目前已安装并正确配置根据为 Windows 套接字实现文档。
WSAVERNOTSUPPORTED (10092)
转换: 超出范围 Winsock.dll 版本。
说明: 的当前 Windows 套接字实现不支持所请求的程序在 Windows 套接字规范版本。 请确保访问没有旧的 Windows
套接字 DLL 文件。
WSANOTINITIALISED (10093)
翻译: 还未执行的成功 WSAStartup。
说明: 是该程序不具有称为 WSAStartup (Wsapiref_1v8y.asp) 或 WSAStartup
(Wsapiref_1v8y.asp) 失败。 该程序可能正在访问不属于当前的活动任务的套接字
(也就其试图共享的任务之间的一套接字),或 WSACleanup 调用次数太多。
WSAEDISCON (10101)
翻译: 正常关机正在进行中的。
说明: 由 WSARecv (Wsapiref_4z1u.asp) 和 WSARecvFrom (Wsapiref_4wky.asp)
指示远程方已启动正常关机顺序返回此错误。
WSATYPE_NOT_FOUND (10109)
翻译: 类别找不到的类型。
说明: 找不到指定的类。
WSAHOST_NOT_FOUND (11001)
翻译: 找不到主机。 没有这类主机是已知的。
说明: 名称不是正式的主机名或别名,或未找到被查询数据库中。
返回此错误可能还会为协议和服务查询以及它意味着在相关数据库中找不到指定的名称。
WSATRY_AGAIN (11002)
翻译: 找不到非权威主机。
说明: 此错误通常是临时的错误过程中解析主机名称和它意味着本地服务器没有从权威服务器收到响应。 在某些时候稍后重试可能成功。
WSANO_RECOVERY (11003)
翻译: 这是用于 nonrecoverable 的错误。
说明: 此错误表明在数据库查找中出现某种排序 nonrecoverable 的错误。 如果找不到数据库文件 (渚嬪 BSD 兼容
HOSTS、 服务,或协议文件),或者出现严重错误,服务器返回了一个 DNS 请求,则可能发生此错误。
WSANO_DATA (11004)
翻译: 有效的名称、 请求类型的任何数据记录。
说明: 请求的名称有效并且已在数据库中找到,但它没有正确正在被解析为的关联的数据。 这对于典型的示例尝试就是一个主机名到地址转换
(使用 gethostbyname [Wsapiref_0q5u.asp] 或 WSAAsyncGetHostByName
[Wsapiref_7bhu.asp]) 使用 DNS 服务器的。 MX 记录,则返回但没有 A 记录。
这意味着主机本身存在,但不是直接可达。
WSA_INVALID_HANDLE (操作系统依赖)
翻译: 指定事件对象句柄无效。
说明: 一个程序试图使用一个事件对象,但指定的句柄则无效。
WSA_INVALID_PARAMETER (操作系统依赖)
翻译: 一个或多个参数均无效。
说明: 一个程序使用一个 Windows 套接字函数直接映射到 Win32 函数。 Win32
函数时,该值指示一个或多个参数有问题。
WSA_IO_INCOMPLETE (操作系统依赖)
翻译: 重叠的 I/O 事件对象不在终止状态。
说明: 程序已尝试确定尚未完成的重叠操作的状态。 该操作完成之前,确定重叠的操作已完成时轮询模式中使用
WSAGetOverlappedResult (与 fWait 标志设置为 FALSE) 的程序将收到此错误代码。
WSA_IO_PENDING (操作系统依赖)
翻译: 重叠的操作将在以后完成。
说明: 程序初始化了无法立即完成一个重叠的操作。 完成操作时,将以后发送完成指示。
WSA_NOT_ENOUGH_MEMORY (操作系统依赖)
翻译: 可用内存不足。
说明: 一个程序使用一个 Windows 套接字函数直接映射到 Win32 函数。 Win32
函数,它指示缺少所需的内存资源。
WSA_OPERATION_ABORTED (操作系统依赖)
翻译: 重叠操作中止。
说明: 由于套接字已关闭或 WSAIoctl (Wsapiref_6ik2.asp) 中的 SIO_FLUSH
命令已运行了一个重叠的操作被取消。
WSAINVALIDPROCTABLE (操作系统依赖)
翻译: 无效的过程从服务提供商的表。
说明: A 服务提供程序返回无效的过程表到 Ws2_32.dll。 (这是通常由于一个或多个正在空的函数指针)。
WSAINVALIDPROVIDER (操作系统依赖)
翻译: 无效的服务提供程序的版本号。
说明: A 服务提供程序返回 2.0 以外的版本号。
WSAPROVIDERFAILEDINIT (操作系统依赖)
转换: 无法初始化服务提供商。
说明: 不能是一个服务提供商的 DLL 加载 (失败 LoadLibrary) 或提供商的 WSPStartup/NSPStartup
函数失败。
WSASYSCALLFAILURE (操作系统依赖)
翻译: 系统调用失败。
说明: 应永不失败的系统调用失败时,将返回此错误。 渚嬪如果 WaitForMultipleObjects
调用失败或其中一个注册表函数失败试图更改协议或 $ 名称空间编录,将发生此错误。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。laokaddk 的BLOG
用户名:laokaddk
文章数:983
评论数:106
访问量:2374110
注册日期:
阅读量:5863
阅读量:12276
阅读量:378064
阅读量:1070756
51CTO推荐博文
1:在IOCP中投递WSASend返回WSA_IO_PENDING的时候,表示异步投递已经成功,但是稍后发送才会完成。这其中涉及到了三个缓冲区。
网卡缓冲区,TCP/IP层缓冲区,程序缓冲区。
情况一:调用WSASend发送正确的时候(即立即返回,且没有错误),TCP/IP将数据从程序缓冲区中拷贝到TCP/IP层缓冲区中,然后不锁定该程序缓冲区,由上层程序自己处理。TCP/IP层缓冲区在网络合适的时候,将其数据拷贝到网卡缓冲区,进行真正的发送。
情况二:调用WSASend发送错误,但是错误码是WSA_IO_PENDING的时候,表示此时TCP/IP层缓冲区已满,暂时没有剩余的空间将程序缓冲区的数据拷贝出来,这时系统将锁定用户的程序缓冲区,按照书上说的WSASend指定的缓冲区将会被锁定到系统的非分页内存中。直到TCP/IP层缓冲区有空余的地方来接受拷贝我们的程序缓冲区数据才拷贝走,并将给IOCP一个完成消息。
情况三:调用WSASend发送错误,但是错误码不是WSA_IO_PENDING,此时应该是发送错误,应该释放该SOCKET对应的所有资源。
2:在IOCP中投递WSARecv的时候,情况相似。
情况一:调用WSARecv正确,TCP/IP将数据从TCP/IP层缓冲区拷贝到缓冲区,然后由我们的程序自行处理了。清除TCP/IP层缓冲区数据。
情况二:调用WSARecv错误,但是返回值是WSA_IO_PENDING,此时是因为TCP/IP层缓冲区中没有数据可取,系统将会锁定我们投递的WSARecv的buffer,直到TCP/IP层缓冲区中有新的数据到来。
情况三:调用WSARecv错误,错误值不是WSA_IO_PENDING,此时是接收出错,应该释放该SOCKET对应的所有资源。
在以上情况中有几个非常要注意的事情:
系统锁定非分页内存的时候,最小的锁定大小是4K(当然,这个取决于您系统的设置,也可以设置小一些,在注册表里面可以改,当然我想这些数值微软应该比我们更知道什么合适了),所以当我们投递了很多WSARecv或者WSASend的时候,不管我们投递的Buffer有多大(0除外),系统在出现IO_PENGDING的时候,都会锁定我们4K的内存。这也就是经常有开发者出现WSANOBUF的情况原因了。
我们在解决这个问题的时候,要针对WSASend和WSARecv做处理
1:投递WSARecv的时候,可以采用一个巧妙的设计,先投递0大小Buf的WSARecv,如果返回,表示有数据可以接收,我们开启真正的recv将数据从TCP/IP层缓冲区取出来,直到WSA_IO_PENGDING.
2:对投递的WSARecv以及WSASend进行计数统计,如果超过了我们预定义的值,就不进行WSASend或者WSARecv投递了。
3:现在我们应该就可以明白为什么WSASend会返回小于我们投递的buffer空间数据值了,是因为TCP/IP层缓冲区小于我们要发送的缓冲区,TCP/IP只会拷贝他剩余可被Copy的缓冲区大小的数据走,然后给我们的WSASend的已发送缓冲区设置为移走的大小,下一次投递的时候,如果TCP/IP层还未被发送,将返回WSA_IO_PENGDING。
4:在很多地方有提到,可以关闭TCP/IP层缓冲区,可以提高一些效率和性能,这个从上面的分析来看,有这个可能,要实际的网络情况去实际分析了。
==================
关于数据包在应用层乱序问题就不多说了(IOCP荒废了TCP在传输层辛辛苦苦保证的有序)。
这无关紧要,因为iocp要管理上千个SOCKET,每个SOCKET的读请求、写请求分别保证串行即可。
=============
关于GetQueuedCompletionStatus的返回值判断:
我给超时值传的是0,直接测试,无须等待。
这里我们关心这几个值:
第二个参数所传回的byte值
第三个参数所传回的complete key值 &&PER HANDLE DATA
第四个参数所传回的OVERLAPPED结构指针 &&PER IO DATA
系统设置的ERROR值。
在超时情况下,byte值返回0,per handle data值是-1,per io data为NULL
1.如果返回FALSE
&&&&one : iocp句柄在外部被关闭。
&& WSAGetLastError返回6(无效句柄),byte值返回0,per handle data值是-1,per io data为NULL
&&&&two: 我们主动close一个socket句柄,或者CancelIO(socket)(且此时有未决的操作)
&&& WSAGetLastError返回995(由于线程退出或应用程序请求,已放弃 I/O 操作)
&& byte值为0,
&& per handle data与per io data正确传回。
&&&three:对端强退(且此时本地有未决的操作)
&& WSAGetLastError返回64(指定的网络名不再可用)
&&byte值为0,per handle data与per io data正确传回&
2.如果返回TRUE【此时一定得到了你投递的OVERLAP结构】
&&&&one:& 我接收到对端数据,然后准备再投递接收请求;但此期间,对端关闭socket。
&& WSARecv返回错误码10054:远程主机强迫关闭了一个现有的连接。
&&&从网上搜到一个做法,感觉很不错:
如果返回FALSE, 那么:如果OVERLAP为空,那一定是发生了错误(注意:请排除TIMEOUT错误);
如果OVERLAP不为空,有可能发生错误。不用管它,这里直接投递请求;如果有错,WSARecv将返回错误。关闭连接即可。
============
关于closesocket操作:
&The&closesocket&function will initiate cancellation on the outstanding I/O operations, but that does not mean that an application will receive I/O completion for these I/O operations by the time the&closesocket&function returns. Thus, an application should not cleanup any resources (&structures, for example) referenced by the outstanding I/O requests until the I/O requests are indeed completed.
在IOCP模式下,如果调用closesocket时有未决的pending & IO,将导致socket被重置,所以有时会出现数据丢失。正统的解决方式是使用shutdown函数(指定SD_SEND标志),注意这时可能有未完成的发送pengding & IO,所以你应该监测是否该连接的所有是否已完成(也许你要用一个计数器来跟踪这些pending & IO),仅在所有send & pending & IO完成后调用shutdown。
MSDN推荐的优雅关闭socket:
Call&&to register for FD_CLOSE notification.
Call&shutdown with&how=SD_SEND.
When FD_CLOSE received, call&&until zero returned, or SOCKET_ERROR.
&FD_CLOSE&being posted after all data is read from a socket. An application should check for remaining data upon receipt of&FD_CLOSE&to avoid any possibility of losing data.
对每个使用接受的连接套结字使用设置选项,这个选项原义是把套结字一些属性(包括内部接受发送缓存大小等等)拷贝到新建立的套结字,却可以使后续的调用成功。
setsockopt( sockClient,
&&&&&&&SOL_SOCKET,
&&&&&&&SO_UPDATE_ACCEPT_CONTEXT,
&&&&&&&(char*)&m_sockListen,
&&&&&&&sizeof(m_sockListen) ) ;
如果是调用AcceptEX接收的连接 不设置该选项的话,随后的shutdown调用
将返回失败, WSAGetLastError() returns 10057 -- WSANOTCONN&
了这篇文章
类别:┆阅读(0)┆评论(0)WSAGetLastError和GetLastError区别,郁闷的很。
BOOL CTcpAsyncSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort){-----------if(connect(m_hSocket,(SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR )    {
int nResult = GetLastError();     //////////////////nResult=10061
WSASetLastError(nResult);                                return FALSE;    }}然后就直接调用GetErrInfo获取中文错误信息。CtestThread是CTcpAsyncSocket派生类,CtestThread中有个函数GetErrInfo,CString CPortMapThread::GetErrInfo(void){ TCHAR   szBuf[128]; LPVOID  lpMsgB CString strMsgB
DWORD   dwErrorCode = GetLastError();    //////////////////dwErrorCode=183    ---------获取错误中文信息       return strMsgB}请问nResult=10061和dwErrorCode=183,错误代码怎么不一样啊?真郁闷,怎样解决才能使错误代码一样啊?非常感谢。
09-12-21 &博客访问: 61075
博文数量: 28
博客积分: 2047
博客等级: 大尉
技术积分: 285
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
下面列示了用户在 Windows 操作系统上使用 TCP/IP 时,可能最常遇到的错误代码。它不是完整的错误列表。可以在文件 winsock2.h 中找到 WSAGetLastError() 返回的错误。如果您未安装开发环境,则在您的系统上可能未安装此文件。在“Windows 套接字 2 应用程序编程接口”中说明了关于特定函数返回的错误的更多信息。可以从下列 Web 站点获取此规范的副本:。WSAEINVAL (10022):无效自变量。它也可以表示套接字的当前状态与要调用的 TCP 函数不兼容,或套接字可能不再有效。 WSAEMFILE (10024):打开的文件太多。打开的套接字太多。每个实现可以有一个全局、每进程或每线程可用的套接字句柄的最大数目。 WSAEWOULDBLOCK (10035):资源暂时不可用。从在非分块的套接字上不能立即完成的操作返回此错误。 WSAEINPROGRESS (10036):正在进行分块“Windows 套接字”操作。“Windows 套接字”仅允许每个任务(或线程)有单个分块操作未完成,并且如果进行任何其它函数调用,则函数由于 WSAEINPROGRESS 而失败。 WSAENOPROTOOPT (10042):错误协议选项。在 getsockopt() 或 setsockopt() 调用中指定了未知、无效或不受支持的选项或级别。 WSAEADDRINUSE (10048):地址已经在使用。通常仅允许每个套接字地址(协议/IP 地址/端口)的一种使用。如果应用程序试图将套接字 bind() 至 IP 地址/端口,而该 IP 地址/端口已经用于现有套接字、未正确关闭的套接字或仍处于关闭进程中的套接字,则发生此错误。 WSAENETDOWN (10050):网络已停止。套接字操作遇到了失效网络。这可能指示网络系统(即,WinSock DLL 溢出的协议堆栈)、网络接口或本地网络本身的严重故障。 WSAENETUNREACH (10051):网络不可到达。试图对不可到达的网络执行套接字操作。这通常表示本地软件知道没有到达远程主机的路由。 WSAENETRESET (10052):网络复位时删除了连接。由于该操作正在进行时“保持活动”活动检测到故障,已中断连接。如果试图在已经失败的连接中设置 SO_KEEPALIVE,则也可能是由 stsockopt() 返回的。 WSAECONNABORTED (10053):软件导致了连接异常终止。可能由于数据传送超时或协议错误,机器上的软件异常终止了已建立的连接, WSAECONNRESET (10054):连接由对等设备复位。远程对等设备强制关闭了现有连接。如果远程机器上的对等应用程序突然停止,机器重新引导,或对等应用程序在远程套接字中使用了“硬关闭”,则通常会导致此结果。如果由于一个或多个操作正在进行时“保持活动”活动检测到故障而中断连接,则也可能导致此错误。正在进行的操作由于 WSAENETRESET 而失败。后续操作由于 WSAECONNRESET 而失败。 WSAENOBUFS (10055):没有可用缓冲区空间。因为系统缺乏足够缓冲区空间或由于队列已满,所以可能无法执行套接字上的操作。 WSAENOTCONN (10057):未连接套接字。 WSAETIMEDOUT (10060):连接超时。因为在一段时间后连接的一方未正确响应,所以连接尝试失败。 WSAECONNREFUSED (10061):连接已被拒绝。如果正在尝试连接至实例或连接至数据库,则检查是否已成功启动服务器上的数据库管理器和 TCP/IP 协议支持。 WSAEHOSTUNREACH (10065):没有至主机的路由。试图对不可到达的机器执行套接字操作。 WSASYSNOTREADY (10091):基础网络子系统未准备好进行网络通信。用户应该检查相应的“Windows 套接字 DLL”是否位于当前路径中,并检查它们是否未尝试同时使用多个 WinSock 实现。如果在您的系统上存在多个 WinSock DLL,则确保路径中的第一个 WinSock DLL 适合于当前已装入的网络子系统,并确保当前已安装并已正确配置所有必要的组件。 WSAVERNOTSUPPORTED (10092):此特定的“Windows 套接字”实现未提供请求的“Windows 套接字 API”支持的版本。检查是否未访问旧的“Windows 套接字 DLL”文件。 WSA_E_NO_MORE (10110), WSAENOMORE (10102):没有可用数据。在“Windows 套接字”版本 2 中,为 WSAENOMORE 和 WSA_E_NO_MORE 定义了冲突的错误代码。在以后版本中将除去错误代码 WSAENOMORE,只有 WSA_E_NO_MORE 将保留。 WSAHOST_NOT_FOUND (11001):找不到主机。 WSATRY_AGAIN (11002):找不到主机。因为本地机器未接收到来自名称服务器的响应,所以请求从名称服务器中检索主机名的 IP 地址失败。 WSANO_DATA (11004):名称无效,没有请求的类型的数据记录。名称服务器或 hosts 文件不识别主机名,或者在 services 文件中未指定服务名。
阅读(4119) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 wsasend send 区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信