socket通信异常摘要及简介
- 格式:doc
- 大小:159.00 KB
- 文档页数:13
10004—WSAEINTR函数调用中断。
该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。
10009—WSAEBADF文件句柄错误。
该错误表明提供的文件句柄无效。
在MicrosoftWindowsCE下,socket函数可能返回这个错误,表明共享串口处于“忙”状态。
10013—WSAEACCES权限被拒。
尝试对套接字进行操作,但被禁止。
若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。
10014—WSAEFAULT地址无效。
传给Winsock函数的指针地址无效。
若指定的缓冲区太小,也会产生这个错误。
10022—WSAEINVAL参数无效。
指定了一个无效参数。
例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。
另外,它也可能表明套接字当前的状态有错,例如在一个目前没有监听的套接字上调用accept或WSAAccept。
10024—WSAEMFILE打开文件过多。
提示打开的套接字太多了。
通常,Microsoft提供者只受到系统内可用资源数量的限制。
10035—WSAEWOULDBLOCK资源暂时不可用。
对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。
比如说,在一个非暂停套接字上调用connect,就会返回这个错误。
因为连接请求不能立即执行。
10036—WSAEINPROGRESS操作正在进行中。
当前正在执行非锁定操作。
一般来说不会出现这个错误,除非正在开发16位Winsock应用程序。
10037—WSAEALREADY操作已完成。
一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。
比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。
另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时,也会出现这个错误。
socket异常解决方案
《Socket异常解决方案》
在开发网络应用程序时,我们经常会遇到socket异常的问题。
socket异常可能会导致网络连接失败,数据传输中断,甚至导
致程序崩溃。
在面对这些问题时,我们需要及时解决并找出根本原因。
首先,我们需要了解造成socket异常的可能原因。
常见的原
因包括网络连接问题,服务器故障,数据包丢失等。
在了解了可能的原因后,就需要针对性地解决这些问题。
解决socket异常的方案可能包括以下几点:
1. 检查网络连接:确认网络连接是否正常,尝试其他网络环境,比如切换到4G网络或者使用VPN连接。
如果网络连接出现
问题,可能是导致socket异常的原因之一。
2. 重启服务器:如果是服务器端出现了问题,可以尝试重启服务器或者联系服务器管理员进行排查。
3. 检查数据包:数据包丢失可能会导致socket异常,对于这
种情况,我们可以使用数据包监控工具来检查数据传输情况,找出问题所在。
4. 异常处理:在程序中加入异常处理机制是很重要的,比如捕获socket异常并进行相应的处理,比如重新连接,重传数据
等。
5. 更新软件版本:有时socket异常可能是由于软件版本过低或者存在bug所致,及时更新软件版本可能解决这些问题。
总之,解决socket异常需要综合考虑网络环境、服务器端和客户端的问题,及时采取合理的措施来解决和避免出现异常情况。
希望上述的解决方案能帮助大家更好地解决socket异常的问题。
C#Socket通信三⼤问题详解C# Socket通信三⼤问题是什么呢?让我们开始讲述:C# Socket通信三⼤问题之数据包界限符问题。
根据原项⽬中交通部标准,在连续观测站中数据包中,使⽤﹤﹥两个字符表⽰有效数据包开始和结束。
实际项⽬有各⾃的具体技术规范C# Socket通信三⼤问题之数据包不连续问题。
在TCP/IP等通信中,由于时延等原因,⼀个数据包被Socket做两次或多次接收,此时在接收第⼀个包后,必须保存到TSession的DatagramBuffer中,在以后⼀并处理C# Socket通信三⼤问题包并发与重叠问题。
由于客户端发送过快或设备故障等原因,⼀次接收到⼀个半、两个或多个包⽂。
此时,也需要处理、⼀个半、两个或多个包先补充异步BeginReceive()回调函数EndReceiveData()中的数据包分合函数ResolveBuffer()。
下⾯是C# Socket通信三⼤问题的实例演⽰:/// ﹤summary﹥/// 1) 报⽂界限字符为﹤﹥,其它为合法字符,/// 2) 按报⽂头、界限标志抽取报⽂,可能合并包⽂/// 3) 如果⼀次收完数据,此时 DatagramBuffer 为空/// 4) 否则转存到包⽂缓冲区 session.DatagramBuffer/// ﹤/summary﹥private void ResolveBuffer(TSession session, int receivedSize){// 上次留下的报⽂缓冲区⾮空(注意:必然含有开始字符﹤,空时不含﹤)bool hasBeginChar = (session.DatagramBufferLength ﹥ 0);int packPos = 0; // ReceiveBuffer 缓冲区中包的开始位置int packLen = 0; // 已经解析的接收缓冲区⼤⼩byte dataByte = 0; // 缓冲区字节int subIndex = 0; // 缓冲区下标while (subIndex ﹤ receivedSize){// 接收缓冲区数据,要与报⽂缓冲区 session.DatagramBuffer 同时考虑dataByte = session.ReceiveBuffer[subIndex];if (dataByte == TDatagram.BeginChar) // 是数据包的开始字符﹤,则前⾯的包⽂均要放弃{// ﹤前⾯有⾮空串(包括报⽂缓冲区),则前⾯是错包⽂,防⽌ AAA﹤A,1,A﹥两个报⽂⼀次读现象if (packLen ﹥ 0){Interlocked.Increment(ref _datagramCount); // 前⾯有⾮空字符Interlocked.Increment(ref _errorDatagramCount); // ⼀个错误包this.OnDatagramError();}session.ClearDatagramBuffer(); // 清空会话缓冲区,开始⼀个新包packPos = subIndex; // 新包起点,即﹤所在位置packLen = 1;// 新包的长度(即﹤)hasBeginChar = true; // 新包有开始字符}else if (dataByte == TDatagram.EndChar) // 数据包的结束字符﹥{if (hasBeginChar) // 两个缓冲区中有开始字符﹤{++packLen; // 长度包括结束字符﹥// ﹥前⾯的为正确格式的包,则分析该包,并准备加⼊包队列AnalyzeOneDatagram(session, packPos, packLen);packPos = subIndex + 1; // 新包起点。
10004—WSAEINTR函数调用中断。
该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。
10009—WSAEBADF文件句柄错误。
该错误表明提供的文件句柄无效。
在MicrosoftWindowsCE下,socket函数可能返回这个错误,表明共享串口处于“忙”状态。
10013—WSAEACCES权限被拒。
尝试对套接字进行操作,但被禁止。
若试图在sendto或WSASendTo中使用一个广播地址,但是尚未用setsockopt和SO_BROADCAST这两个选项设置广播权限,便会产生这类错误。
10014—WSAEFAULT地址无效。
传给Winsock函数的指针地址无效。
若指定的缓冲区太小,也会产生这个错误。
10022—WSAEINV AL参数无效。
指定了一个无效参数。
例如,假如为WSAIoctl调用指定了一个无效控制代码,便会产生这个错误。
另外,它也可能表明套接字当前的状态有错,例如在一个目前没有监听的套接字上调用accept或WSAAccept。
10024—WSAEMFILE打开文件过多。
提示打开的套接字太多了。
通常,Microsoft提供者只受到系统内可用资源数量的限制。
10035—WSAEWOULDBLOCK资源暂时不可用。
对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。
比如说,在一个非暂停套接字上调用connect,就会返回这个错误。
因为连接请求不能立即执行。
10036—WSAEINPROGRESS操作正在进行中。
当前正在执行非锁定操作。
一般来说不会出现这个错误,除非正在开发16位Winsock应用程序。
10037—WSAEALREADY操作已完成。
一般来说,在非锁定套接字上尝试已处于进程中的操作时,会产生这个错误。
比如,在一个已处于连接进程的非锁定套接字上,再一次调用connect或WSAConnect。
另外,服务提供者处于执行回调函数(针对支持回调例程的Winsock函数)的进程中时,也会出现这个错误。
socket通信原理和实例讲解Socket通信原理是基于TCP/IP协议实现的一种传输层协议,它在网络上提供了一种可靠的数据传输方式。
Socket可以简单理解为一个管道,可以在不同的主机之间传递数据。
在Socket通信中,有两个最基本的角色:服务器和客户端。
服务器端创建一个Socket对象,并绑定到一个端口上,等待客户端的连接;客户端通过创建一个Socket对象,指定服务器的IP地址和端口号,与服务器建立连接。
一般的Socket通信流程如下:1. 服务器端创建Socket对象,并绑定到一个端口上;2. 服务器端通过监听函数等待客户端的连接请求;3. 客户端创建Socket对象,并指定服务器的IP地址和端口号,向服务器发起连接请求;4. 服务器接收到客户端的连接请求后,创建一个新的Socket对象,与客户端的Socket对象建立连接;5. 服务器和客户端通过各自的Socket对象进行通信,发送和接收数据;6. 通信完成后,服务器和客户端可以关闭各自的Socket对象。
下面是一个简单的Python实例,演示了基于Socket的服务器和客户端之间的通信:服务器端代码:```pythonimport socket# 创建一个Socket对象server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定到一个端口上server_socket.bind(('localhost', 8888))# 监听客户端的连接请求server_socket.listen(1)print("Waiting for connection...")# 接收客户端的连接请求client_socket, client_addr = server_socket.accept() print("Connected with", client_addr)# 接收客户端发送的数据data = client_socket.recv(1024).decode()print("Received:", data)# 发送响应数据给客户端response = "Hello, Client!"client_socket.send(response.encode())# 关闭连接client_socket.close()server_socket.close()```客户端代码:```pythonimport socket# 创建一个Socket对象client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 连接服务器server_addr = ('localhost', 8888)client_socket.connect(server_addr)# 向服务器发送数据data = "Hello, Server!"client_socket.send(data.encode())# 接收服务器的响应数据response = client_socket.recv(1024).decode()print("Received:", response)# 关闭连接client_socket.close()```以上就是Socket通信的原理和一个简单的实例讲解。
Socket的错误码和描述Socket的错误码和描述(中英文翻译)//下面是Socket Error的错误码和描述:Socket error 0 - Directly send errorSocket error 10004 - Interrupted function //call 操作被终止Socket error 10013 - Permission denied //c访问被拒绝Socket error 10014 - Bad address //c地址错误Socket error 10022 - Invalid argument //参数错误Socket error 10024 - Too many open files // 打开太多的socketsSocket error 10035 - Resource temporarily unavailable // 没有可以获取的资料Socket error 10036 - Operation now in progress // 一个阻塞操作正在进行中Socket error 10037 - Operation already in progress // 操作正在进行中Socket error 10038 - Socket operation on non-socket //非法的socket对象在操作Socket error 10039 - Destination address required //目标地址错误Socket error 10040 - Message too long //数据太长Socket error 10041 - Protocol wrong type for socket //协议类型错误Socket error 10042 - Bad protocol option // 错误的协议选项Socket error 10043 - Protocol not supported //协议不被支持Socket error 10044 - Socket type not supported //socket类型不支持Socket error 10045 - Operation not supported //不支持该操作Socket error 10046 - Protocol family not supported //协议族不支持Socket error 10047 - Address family not supported by protocol family//使用的地址族不在支持之列Socket error 10048 - Address already in use //地址已经被使用Socket error 10049 - Cannot assign requested address //地址设置失败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 10054 - connection reset by peer //连接被重置Socket error 10055 - No buffer space available //缓冲区不足Socket error 10056 - Socket is already connected // socket已经连接Socket error 10057 - Socket is not connected //socket没有连接Socket error 10058 - Cannot send after socket shutdown //socket已经关闭Socket error 10060 - Connection timed out //超时Socket error 10061 - Connection refused //连接被拒绝Socket error 10064 - Host is down //主机已关闭Socket error 10065 - No route to host // 没有可达的路由Socket error 10067 - Too many processes //进程太多Socket error 10091 - Network subsystem is unavailable //网络子系统不可用Socket error 10092 - WINSOCK.DLL version out of range//winsock.dll版本超出范围Socket error 10093 - Successful WSAStartup not yet performed //没有成功执行WSAStartupSocket error 10094 - Graceful shutdown in progress //Socket error 11001 - Host not found //主机没有找到Socket error 11002 - Non-authoritative host not found // 非授权的主机没有找到Socket error 11003 - This is a non-recoverable error //这是个无法恢复的错误Socket error 11004 - Valid name, no data record of requested type //请求的类型的名字或数据错误WSAEADDRINUSE (10048) Address already in useWSAECONNABORTED (10053) Software caused connection abortWSAECONNREFUSED (10061) Connection refusedWSAECONNRESET (10054) Connection reset by peerWSAEDESTADDRREQ (10039) Destination address required WSAEHOSTUNREACH (10065) No route to hostWSAEMFILE (10024) Too many open filesWSAENETDOWN (10050) Network is downWSAENETRESET (10052) Network dropped connectionWSAENOBUFS (10055) No buffer space availableWSAENETUNREACH (10051) Network is unreachableWSAETIMEDOUT (10060) Connection timed outWSAHOST_NOT_FOUND (11001) Host not foundWSASYSNOTREADY (10091) Network sub-system is unavailableWSANOTINITIALISED (10093) WSAStartup() not performed WSANO_DATA (11004) Valid name, no data of that typeWSANO_RECOVERY (11003) Non-recoverable query error WSATRY_AGAIN (11002) Non-authoritative host foundWSAVERNOTSUPPORTED (10092) Wrong WinSock DLL version。
socket连接关闭问题分析socket编程过程中往往会遇到这样那样的问题,出现了这些问题,有的是由于并发访问量太⼤造成的,有些却是由于代码中编程不慎造成的。
⽐如说,最常见的错误就是程序中报打开的⽂件数过多这个错误。
socket建⽴连接的时候是三次握⼿,这个⼤家都很清楚,但是socket关闭连接的时候,需要进⾏四次挥⼿,但很多⼈对于这四次挥⼿的具体流程不清楚,吃了很多亏。
CLOSE_WAIT分析socket是⼀种全双⼯的通信⽅式,建⽴完socket连接后,连接的任何⼀⽅都可以发起关闭操作。
这⾥不妨假设连接的关闭是客户端发起。
客户端的代码如下:代码⽚段1.1ret = CS_GetConnect(&client,ipAddr,9010);if (ret == 0) {printf("connected success.");}CloseSocket(client);基本逻辑就是,连接建⽴后⽴即关闭。
其中CloseSocket函数是⾃定义函数,仅仅封装了在windows和linux下关闭socket的不同实现⽽已代码⽚段1.2#if defined(WIN32) || defined(WIN64)#define CloseSocket(fd) do{ closesocket(fd);/* shutdown(fd, 2);*/ }while(0)#else#define CloseSocket(fd) do{ close(fd); /*shutdown(fd,2);*/ }while(0)#endif客户端调⽤了CloseSocket之后,发送FIN信号到服务器端,告诉socket程序,连接已经断开。
服务器端接收到FIN信号后,会将⾃⾝的TCP状态置为`CLOSE_WAIT`,同时回复⼀个ACK信号给客户端,客户端接收到这个ACK信号后,⾃⾝将处于`FIN_WAIT_2`状态。
SocketError代码解释大全Socket Error代码解释大全Socket error 0 - Directly send errorSocket error 10004 - Interrupted function call一个封锁操作被对 WSACancelBlockingCall 的调用中断。
Socket error 10013 - Permission denied以一种访问权限不允许的方式做了一个访问套接字的尝试。
Socket error 10014 - Bad address系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
Socket error 10022 - Invalid argument提供了一个无效的参数。
Socket error 10024 - Too many open files打开的套接字太多。
Socket error 10035 - Resource temporarily unavailable无法立即完成一个非阻止性套接字操作。
Socket error 10036 - Operation now in progress 目前正在执行一个阻止性操作。
Socket error 10037 - Operation already in progress 在一个非阻止性套接字上尝试了一个已经在进行的操作。
Socket error 10038 - Socket operation on non-socket 在一个非套接字上尝试了一个操作。
Socket error 10039 - Destination address required 请求的地址在一个套接字中从操作中忽略。
Socket error 10040 - Message too long 一个在数据报套接字上发送的消息大于内部消息缓冲区或其他一些网络限制,或该用户用于接收数据报的缓冲区比数据报小。
WSAEINTR (10004)∙翻译:中断函数调用。
∙说明:阻止操作被中断通过调用WSACancelBlockingCall (Wsapiref_704y.asp)。
WSAEACCES (10013)∙翻译:权限被拒绝。
∙说明:尝试访问套接字访问权限被禁止的方式。
例如,用于发送到广播的地址,但广播的权限未设置通过使用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)∙翻译:错误的地址。
∙说明:尝试使用指针参数的调用时,系统检测到一个无效的指针地址。
如果程序传递了无效的指针值,或者如果缓冲区的长度太小,则会发生此错误。
例如,如果一个参数,它是一种SOCKADDR 结构的长度小于sizeof(SOCKADDR) 的值,将发生此问题。
WSAEINVAL (10022)∙翻译:无效的参数。
∙说明:setsockopt (Wsapiref_94aa.asp) 函数提供了无效的参数(例如,指定参数的%)。
有时,它也就是从插座的当前状态,调用例如,未在侦听的套接字接受(Wsapiref_13aq.asp)。
WSAEMFILE (10024)∙翻译:打开的文件太多。
∙说明:有太多打开的套接字。
每个实现都可能具有套接字句柄可用的最大数目。
这些句柄可能会提供每个进程的全局,或每个线程。
WSAEWOULDBLOCK (10035)∙翻译:资源暂时不可用。
∙说明:将返回此错误,无法立即完成,例如,非阻塞套接字操作从接收(Wsapiref_2i9e.asp)时无数据排队要从套接字读取。
一、概述在计算机编程中,socket编程是一种常见的网络通信方式,通过socket可以实现不同主机之间的网络通信。
在使用socket编程时,经常会遇到各种错误,而这些错误通常会用errno枚举来表示。
errno 枚举定义了各种可能出现的错误类型,程序员可以根据errno的值来判断程序运行时出现的具体错误,从而进行相应的处理。
二、errno枚举errno枚举定义了许多可能出现的错误类型,下面我将按照错误类型进行分类介绍。
1. 常见错误类型在socket编程中,常见的错误类型包括但不限于以下几种:- EACCES:权限不足,通常指的是对某些系统资源的权限不够。
- EADDRINUSE:位置区域已被使用,通常指的是在绑定socket位置区域时,该位置区域已被其他进程占用。
- EAG本人N:资源暂时不可用,通常指的是资源暂时不可用,需要稍后重试。
- ECONNREFUSED:连接被拒绝,通常指的是远程主机拒绝连接请求。
- EFAULT:位置区域错误,通常指的是指针参数指向的位置区域无效。
- EINTR:中断系统调用,通常指的是系统调用被信号中断。
- EINVAL:无效参数,通常指的是传递给系统调用的参数无效。
- EIO:I/O错误,通常指的是发生了I/O错误。
- EISCONN:已连接,通常指的是socket已经连接。
2. 其他错误类型除了上述常见的错误类型外,errno枚举还定义了许多其他的错误类型,程序员在使用socket编程时可以根据实际情况进行具体的处理。
三、errno值每个错误类型在errno枚举中都有对应的数值,程序员可以通过这些数值来判断程序运行时出现的具体错误。
下面我将列举一些常见的errno值:1. EACCES的值为132. EADDRINUSE的值为483. EAG本人N的值为114. ECONNREFUSED的值为1115. EFAULT的值为146. EINTR的值为47. EINVAL的值为228. EIO的值为59. EISCONN的值为106四、处理错误在程序编写过程中,我们需要针对不同的错误类型进行相应的处理,以保证程序的健壮性和稳定性。
socket 读写超时详解摘要:1.概述2.Socket 读写超时的原因3.Socket 读写超时的解决方法4.总结正文:1.概述在网络编程中,Socket 是一种应用层协议,它提供了一个应用程序与网络之间的接口,使得数据能够在网络中进行传输。
在使用Socket 进行网络通信时,可能会遇到读写超时的问题。
本文将详细解释Socket 读写超时的原因,并提供相应的解决方法。
2.Socket 读写超时的原因Socket 读写超时通常是由于以下原因导致的:(1) 网络拥堵:当网络中的数据包数量过多,导致网络拥堵时,数据包的传输速度会降低,从而导致Socket 读写超时。
(2) 服务器负载过高:当服务器的负载过高时,它可能无法及时响应客户端的请求,从而导致Socket 读写超时。
(3) 网络故障:当网络出现故障时,数据包的传输可能会受到影响,从而导致Socket 读写超时。
(4) 程序错误:当程序中存在错误时,可能会导致Socket 读写超时。
3.Socket 读写超时的解决方法针对Socket 读写超时的问题,可以采取以下措施进行解决:(1) 优化网络环境:尽量避免在网络拥堵的时段进行数据传输,或者使用质量更高的网络线路。
(2) 提高服务器性能:通过提高服务器的性能,可以降低服务器的负载,从而提高其响应速度。
(3) 调整Socket 超时设置:通过调整Socket 的超时设置,可以增加读写操作的时间,从而减少超时发生的概率。
在设置超时时间时,需要根据实际情况进行调整,以保证既能减少超时发生的概率,又不会影响程序的性能。
(4) 检查程序代码:通过检查程序代码,可以发现并修复程序中存在的错误,从而避免Socket 读写超时的问题。
4.总结Socket 读写超时是网络编程中常见的问题,它可能会导致程序无法正常运行。
Socket网络编程常见异常概述(1)Socket 类中有很多方法在声明时使用throws 抛出了一些异常,这些异常都是IOException 的子类。
(2)在Socket 类的方法中抛出最多的就是SocketException,其余还有七个异常可供Socket 类的方法抛出。
Java编程语言百科异常概述(1)public class IOException extends Exception这个异常是所有在Socket 类的方法中抛出的异常的父类。
(2)public class SocketException extends IOException这个异常在Socket 类的方法中使用得最频繁。
(3)public class ConnectException extends SocketExceptionConnectException 异常通常发生在由于服务器忙而未响应或是服务器相应的监听端口未打开。
(4)public class BindException extends SocketException这个异常在多个Socket 或ServerSocket 对象绑定在同一个端口,而且未打开SO_REUSEADDR选项时发生。
(5)public class NoRouteToHostException extends SocketException这个异常在遇到防火墙或是路由无法找到主机的情况下发生。
(6)public class UnknownHostException extends IOException这个异常在域名不正确时被抛出。
(7)public class ProtocolException extends IOException这个异常并不经常被抛出。
由于不明的原因,TCP/IP 的数据包被破坏了,这时将抛出ProtocolException 异常。
(8)public class SocketTimeoutException extends InterruptedIOException如果在连接超时和读取数据超时时间过后,服务器仍然未响应,connect 或read 方法抛SocketTimeoutException 异常。
10004—WSAEIN TR函数调用中断。
该错误表明由于对WSA CancelBlockingC all的调用,造成了一次调用被强行中断。
10009—WSAEBA DF文件句柄错误。
该错误表明提供的文件句柄无效。
在Micro softW i ndowsCE下,socket函数可能返回这个错误,表明共享串口处于“忙”状态。
10013—WSAEAC CES权限被拒。
尝试对套接字进行操作,但被禁止。
若试图在se ndto或WSASe ndTo中使用一个广播地址,但是尚未用s etsockopt和SO_BR OADCA ST这两个选项设置广播权限,便会产生这类错误。
10014—WSAEFA ULT地址无效。
传给Winsock函数的指针地址无效。
若指定的缓冲区太小,也会产生这个错误。
10022—WSAEIN V AL参数无效。
指定了一个无效参数。
例如,假如为WSA Ioctl调用指定了一个无效控制代码,便会产生这个错误。
另外,它也可能表明套接字当前的状态有错,例如在一个目前没有监听的套接字上调用accept或W SAA ccept。
10024—WSAEMF ILE打开文件过多。
提示打开的套接字太多了。
通常,Microsoft提供者只受到系统内可用资源数量的限制。
10035—WSAEWO ULDBL OCK资源暂时不可用。
对非锁定套接字来说,如果请求操作不能立即执行的话,通常会返回这个错误。
比如说,在一个非暂停套接字上调用connect,就会返回这个错误。
因为连接请求不能立即执行。
10036—WSAEIN PROGR ESS操作正在进行中。
当前正在执行非锁定操作。
一般来说不会出现这个错误,除非正在开发16位Wi nsock应用程序。
SocketException.ErrorCode 列表及注释,Winsocket Error 列表及注释注释是英文的,大家需要可以用翻译软件直接译,大体意思没问题。
WinSock Error CodesThe following error codes apply to the WinSock ActiveX Controls.Error Code Error Message10004 The operation is canceled.操作被取消10013 The requested address is a broadcast address, but flag is not set.10014 Invalid argument.10022 Socket not bound, invalid address or listen is not invoked prior to accept. 10024 No more file descriptors are available, accept queue is empty.10035 Socket is non-blocking and the specified operation will block.10036 A blocking Winsock operation is in progress.10037 The operation is completed. No blocking operation is in progress.10038 The descriptor is not a socket.10039 Destination address is required.10040 The datagram is too large to fit into the buffer and is truncated.10041 The specified port is the wrong type for this socket.10042 Option unknown, or unsupported.10043 The specified port is not supported.10044 Socket type not supported in this address family.10045 Socket is not a type that supports connection oriented service.10047 Address Family is not supported.10048 Address in use.10049 Address is not available from the local machine.10050 Network subsystem failed.10051 The network cannot be reached from this host at this time.10052 Connection has timed out when SO_KEEPALIVE is set.10053 Connection is aborted due to timeout or other failure.10054 The connection is reset by remote side.连接被远程端重置10055 No buffer space is available.10056 Socket is already connected.10057 Socket is not connected.10058 Socket has been shut down.10060 The attempt to connect timed out.10061 Connection is forcefully rejected.10201 Socket already created for this object.10202 Socket has not been created for this object. 11001 Authoritative answer: Host not found.11002 Non-Authoritative answer: Host not found. 11003 Non-recoverable errors.11004 Valid name, no data record of requested type.。
socket常见错误代码解析Socket error 0 - Directly send errorSocket error 10004 - Interrupted function callSocket error 10013 - Permission deniedSocket error 10014 - Bad addressSocket error 10022 - Invalid argumentSocket error 10024 - Too many open filesSocket error 10035 - Resource temporarily unavailableSocket error 10036 - Operation now in progressSocket error 10037 - Operation already in progressSocket error 10038 - Socket operation on non-socketSocket error 10039 - Destination address requiredSocket error 10040 - Message too longSocket error 10041 - Protocol wrong type for socketSocket error 10042 - Bad protocol optionSocket error 10043 - Protocol not supportedSocket error 10044 - Socket type not supportedSocket error 10045 - Operation not supportedSocket error 10046 - Protocol family not supportedSocket error 10047 - Address family not supported by protocol family Socket error 10048 - Address already in useSocket error 10049 - Cannot assign requested addressSocket error 10050 - Network is downSocket error 10051 - Network is unreachableSocket error 10052 - Network dropped connection on resetSocket error 10053 - Software caused connection abortSocket error 10054 - Connection reset by peerSocket error 10055 - No buffer space availableSocket error 10056 - Socket is already connectedSocket error 10057 - Socket is not connectedSocket error 10058 - Cannot send after socket shutdownSocket error 10060 - Connection timed outSocket error 10061 - Connection refusedSocket error 10064 - Host is downSocket error 10065 - No route to hostSocket error 10067 - Too many processesSocket error 10091 - Network subsystem is unavailableSocket error 10092 - WINSOCK.DLL version out of rangeSocket error 10093 - Successful WSAStartup not yet performed Socket error 10094 - Graceful shutdown in progressSocket error 11001 - Host not foundSocket error 11002 - Non-authoritative host not foundSocket error 11003 - This is a non-recoverable errorSocket error 11004 - Valid name, no data record of requested typeWSAEADDRINUSE (10048) Address already in useWSAECONNABORTED (10053) Software caused connection abort WSAECONNREFUSED (10061) Connection refusedWSAECONNRESET (10054) Connection reset by peerWSAEDESTADDRREQ (10039) Destination address requiredWSAEHOSTUNREACH (10065) No route to hostWSAEMFILE (10024) Too many open filesWSAENETDOWN (10050) Network is downWSAENETRESET (10052) Network dropped connectionWSAENOBUFS (10055) No buffer space availableWSAENETUNREACH (10051) Network is unreachableWSAETIMEDOUT (10060) Connection timed outWSAHOST_NOT_FOUND (11001) Host not foundWSASYSNOTREADY (10091) Network sub-system is unavailable WSANOTINITIALISED (10093) WSAStartup() not performedWSANO_DATA (11004) V alid name, no data of that typeWSANO_RECOVERY (11003) Non-recoverable query errorWSA TRY_AGAIN (11002) Non-authoritative host foundWSA VERNOTSUPPORTED (10092) Wrong WinSock DLL version++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++常見SOCKET錯誤返回碼WSAEINTR (10004)被中斷的系統呼叫當以阻攔式進行的WinSock函式被WSACancelBlockingCall()中斷的時候,這個阻攔式函式會得到WSAEINTR這個錯誤訊息。
socket异常摘要编辑BindException ;试图将套接字绑定到本地地址和端口时发生错误的情况下,抛出此异常。
ConnectException ;试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。
HttpRetryException ;抛出此异常指示 HTTP 请求需要重试,但由于启用了流模式而无法自动重试。
MalformedURLException ;抛出这一异常指示出现了错误的 URL。
NoRouteToHostException ;试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。
PortUnreachableException ;在连接的数据报上已接收到 ICMP Port Unreachable 消息时,抛出该异常。
ProtocolException ;抛出此异常指示在底层协议中存在错误,如 TCP 错误。
SocketException ;抛出此异常指示在底层协议中存在错误,如 TCP 错误。
SocketTimeoutException ;如果在读取或接受套接字时发生超时,则抛出此异常。
UnknownHostException ;指示主机IP 地址无法确定而抛出的异常。
UnknownServiceException ;抛出这一异常指示出现了未知服务异常。
URISyntaxException ;抛出经过检查的指示字符串不能解析为 URI 引用的异常。
一、Socket通信简介Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。
两者的最大差异在于,http 连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。
而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。
那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。
通过建立socket连接,可为通信双方的数据传输传提供通道。
socket的主要特点有数据丢失率低,使用简单且易于移植。
1.1什么是Socket Socket是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。
简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。
1.2Socket的分类根据不同的的底层协议,Socket的实现是多样化的。
本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。
流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。
数据报套接字使用UDP协议,提供数据打包发送服务。
下面,我们来认识一下这两种Socket 类型的基本实现模型。
二、Socket 基本通信模型三、Socket基本实现原理3.1基于TCP协议的Socket服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。
accept()方法在没有数据进行接收的处于堵塞状态。
(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。
客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket("172.168.10.108",8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。
3.2基于UDP协议的数据传输服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。
接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。
客户端也创建个DatagramSocket对象,并且指点监听的端口。
接下来创建一个InetAddress 对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。
*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)四、android 实现socket简单通信前言:添加权限[java]view plaincopyprint?1.<!--允许应用程序改变网络状态-->2.<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>3.4.<!--允许应用程序改变WIFI连接状态-->5.<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>6.7.<!--允许应用程序访问有关的网络信息-->8.<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>9.10.<!--允许应用程序访问WIFI网卡的网络信息-->11.<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>12.13.<!--允许应用程序完全使用网络-->14.<uses-permission android:name="android.permission.INTERNET"/>4.1使用TCP协议通信android端实现:[java]view plaincopyprint?1.protected void connectServerWithTCPSocket() {2.3.Socket socket;4.try {// 创建一个Socket对象,并指定服务端的IP及端口号5.socket = new Socket("192.168.1.32", 1989);6.// 创建一个InputStream用户读取要发送的文件。
7.InputStream inputStream = new FileInputStream("e://a.txt");8.// 获取Socket的OutputStream对象用于发送数据。
9.OutputStream outputStream = socket.getOutputStream();10.// 创建一个byte类型的buffer字节数组,用于存放读取的本地文件11.byte buffer[] = new byte[4 * 1024];12.int temp = 0;13.// 循环读取文件14.while ((temp = inputStream.read(buffer)) != -1) {15.// 把数据写入到OuputStream对象中16.outputStream.write(buffer, 0, temp);17.}18.// 发送读取的数据到服务端19.outputStream.flush();20.21./** 或创建一个报文,使用BufferedWriter写入,看你的需求 **/22.// String socketData = "[2143213;21343fjks;213]";23.// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(24.// socket.getOutputStream()));25.// writer.write(socketData.replace("\n", " ") + "\n");26.// writer.flush();27./************************************************/28.} catch (UnknownHostException e) {29.e.printStackTrace();30.} catch (IOException e) {31.e.printStackTrace();32.}33.34.}服务器端简单实现:[java]view plaincopyprint?1.public void ServerReceviedByTcp() {2.// 声明一个ServerSocket对象3.ServerSocket serverSocket = null;4.try {5.// 创建一个ServerSocket对象,并让这个Socket在1989端口监听6.serverSocket = new ServerSocket(1989);7.// 调用ServerSocket的accept()方法,接受客户端所发送的请求,8.// 如果客户端没有发送数据,那么该线程就停滞不继续9.Socket socket = serverSocket.accept();10.// 从Socket当中得到InputStream对象11.InputStream inputStream = socket.getInputStream();12.byte buffer[] = new byte[1024 * 4];13.int temp = 0;14.// 从InputStream当中读取客户端所发送的数据15.while ((temp = inputStream.read(buffer)) != -1) {16.System.out.println(new String(buffer, 0, temp));17.}18.serverSocket.close();19.} catch (IOException e) {20.e.printStackTrace();21.}22.}4.2使用UDP协议通信客户端发送数据实现:[java]view plaincopyprint?1.protected void connectServerWithUDPSocket() {2.3.DatagramSocket socket;4.try {5.//创建DatagramSocket对象并指定一个端口号,注意,如果客户端需要接收服务器的返回数据,6.//还需要使用这个端口号来receive,所以一定要记住7.socket = new DatagramSocket(1985);8.//使用InetAddress(Inet4Address).getByName把IP地址转换为网络地址9.InetAddress serverAddress = InetAddress.getByName("192.168.1.32");10.//Inet4Address serverAddress = (Inet4Address)Inet4Address.getByName("192.168.1.32");11.String str = "[2143213;21343fjks;213]";//设置要发送的报文12.byte data[] = str.getBytes();//把字符串str字符串转换为字节数组13.//创建一个DatagramPacket对象,用于发送数据。