Linux socket错误分析

合集下载

socket异常解决方案

socket异常解决方案

socket异常解决方案
《Socket异常解决方案》
在开发网络应用程序时,我们经常会遇到socket异常的问题。

socket异常可能会导致网络连接失败,数据传输中断,甚至导
致程序崩溃。

在面对这些问题时,我们需要及时解决并找出根本原因。

首先,我们需要了解造成socket异常的可能原因。

常见的原
因包括网络连接问题,服务器故障,数据包丢失等。

在了解了可能的原因后,就需要针对性地解决这些问题。

解决socket异常的方案可能包括以下几点:
1. 检查网络连接:确认网络连接是否正常,尝试其他网络环境,比如切换到4G网络或者使用VPN连接。

如果网络连接出现
问题,可能是导致socket异常的原因之一。

2. 重启服务器:如果是服务器端出现了问题,可以尝试重启服务器或者联系服务器管理员进行排查。

3. 检查数据包:数据包丢失可能会导致socket异常,对于这
种情况,我们可以使用数据包监控工具来检查数据传输情况,找出问题所在。

4. 异常处理:在程序中加入异常处理机制是很重要的,比如捕获socket异常并进行相应的处理,比如重新连接,重传数据
等。

5. 更新软件版本:有时socket异常可能是由于软件版本过低或者存在bug所致,及时更新软件版本可能解决这些问题。

总之,解决socket异常需要综合考虑网络环境、服务器端和客户端的问题,及时采取合理的措施来解决和避免出现异常情况。

希望上述的解决方案能帮助大家更好地解决socket异常的问题。

socket错误代码

socket错误代码

socket错误代码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 ⼀个在数据报套接字上发送的消息⼤于内部消息缓冲区或其他⼀些⽹络限制,或该⽤户⽤于接收数据报的缓冲区⽐数据报⼩。

Socket error 10041 - Protocol wrong type for socket 在套接字函数调⽤中指定的⼀个协议不⽀持请求的套接字类型的语法。

socket编程中遇到的问题,及其解决方案(一)

socket编程中遇到的问题,及其解决方案(一)
' There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))
' Receive buffer.
Public buffer(BufferSize) As Byte
' Received data string.
Public sb As New StringBuilder
public static s as socket
' Read data from the client socket.
Try
Dim bytesRead As Integer = handler.EndReceive(ar)’这是发生问题的地方,
If bytesRead > 0 Then
allDone.Reset()’一个ManualResetEvent变量,这里使其挂起主程序
' Start an asynchronous socket to listen for connections.
Me.connectnum = Me.connectnum + 1
Me.Send(stateobject.s, Me.TextBox2.Text)
BeginInvoke(New EventHandler(AddressOf showinfo), Me.TextBox2.Text)
End If
期中stateobject,是一个类,具体代码如下:
handler.Shutdown(SocketShutdown.Both)

SOCKET常用函数的返回值分析

SOCKET常用函数的返回值分析
如果成功就返回收到的字节数如果如果失败就返回socketerror需要通过wsagetlasterror获得进一步的错误信息
SOCKET常用函数的返回值分析
from /icedmilk/article/details/53361) accept()
如果成功就返回生成的SOCKET,如果失败就返回INVALID_SOCKET.
#define INVALID_SOCKET (SOCKET)(~0)
实际上是 0xFFFFFFFF 4bytes
bind() listen() connect()
如果成功就返回0,如果失败就返回SOCKET_ERROR,需要通过WSAGetLastError获得进一步的错误信息.
#define SOCKET_ERROR (-1)
实际上是 0xFFFFFFFF 4bytes
send() sendto()
如果成功就返回发送的字节数,如果失败就返回SOCKET_ERROR,需要通过WSAGetLastError获得进一步的错误信息.
recv() recvfrom()
如果成功就返回收到的字节数,如果如果失败就返回SOCKET_ERROR,需要通过WSAGetLastError获得进一步的错误信息.
如果连接被温和的关闭,返回0,但是recvfrom通常是用于无连接的UDP socket.

Linux socket 编程中存在的五个隐患

Linux socket 编程中存在的五个隐患

在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性。

事实上,很难找到一种不支持Sockets API 的现代语言。

该API 相当简单,但新的开发人员仍然会遇到一些常见的隐患。

本文识别那些隐患并向您显示如何避开它们。

隐患1.忽略返回状态第一个隐患很明显,但它是开发新手最容易犯的一个错误。

如果您忽略函数的返回状态,当它们失败或部分成功的时候,您也许会迷失。

反过来,这可能传播错误,使定位问题的源头变得困难。

捕获并检查每一个返回状态,而不是忽略它们。

考虑清单1 显示的例子,一个套接字send 函数。

清单 1. 忽略API 函数返回状态int status, sock, mode;/* Create a new stream (TCP) socket */sock = socket( AF_INET, SOCK_STREAM, 0 );...status = send( sock, buffer, buflen, MSG_DONTW AIT );if (status == -1) {/* send failed */printf( "send failed: %s\n", strerror(errno) );} else {/* send succeeded -- or did it? */}清单 1 探究一个函数片断,它完成套接字send 操作(通过套接字发送数据)。

函数的错误状态被捕获并测试,但这个例子忽略了send 在无阻塞模式(由MSG_DONTWAIT 标志启用)下的一个特性。

send API 函数有三类可能的返回值:∙如果数据成功地排到传输队列,则返回0。

∙如果排队失败,则返回-1(通过使用errno 变量可以了解失败的原因)。

∙如果不是所有的字符都能够在函数调用时排队,则最终的返回值是发送的字符数。

由于send 的MSG_DONTWAIT 变量的无阻塞性质,函数调用在发送完所有的数据、一些数据或没有发送任何数据后返回。

Socket异常

Socket异常

在C#中,我们直接用一个Byte数组传递给函数:
uint dummy = 0;
byte[] inOptionValues = new byte[Marshal.SizeOf(dummy) * 3];
BitConverter.GetBytes((uint)1).CopyTo(inOptionValues, 0);//是否启用Keep-Alive
info.Index = id;
Public.s_userList.Add(id, info);
socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), info);
对于这种情况,我们很好处理,因为客户端程序异常退出会在服务端引发ConnectionReset的Socket异常(就是WinSock2中的10054异常)。只要在服务端处理这个异常就可以了。
2、网络链路异常。
如:网线拔出、交换机掉电、客户端机器掉电。当出现这些情况的时候服务端不会出现任何异常。这样的话上面的代码就不能处理这种情况了。对于这种情况在MSDN里面是这样处理的,我在这里贴出MSDN的原文:
try
{
Accept(inOptionValues);
}
catch { }
}
}
private static void Accept(byte[] inOptionValues)
{
Socket socket = Public.s_socketHandler.Accept();
byte[] optionInValue,

Linux socket通信出现CLOSE WAIT

Linux socket通信出现CLOSE WAIT

Linux socket通信出现CLOSE_WAIT状态的原因与解决方法这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司竟然都面到到了这个问题,不得不使我开始关注这个问题。

说起CLOSE_WAIT状态,如果不知道的话,还是先瞧一下TCP的状态转移图吧。

关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。

前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。

将关闭部分的状态转移摘出来,就得到了下图:产生原因通过TCP状态转换图,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢?在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。

通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。

但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。

出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。

代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。

参考资料4中描述,通过发送SYN-FIN报文来达到产生CLOSE_WAIT状态连接,没有进行具体实验。

不过个人认为协议栈会丢弃这种非法报文,感兴趣的同学可以测试一下,然后把结果告诉我;-)为了更加清楚的说明这个问题,我们写一个测试程序,注意这个测试程序是有缺陷的。

只要我们构造一种情况,使得对方关闭了socket,我们还在read,或者是直接不关闭socket就会构造这样的情况。

server.c:#include#include#include#define MAXLINE 80#define SERV_PORT 8000int main(void){struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;int listenfd, connfd;char buf[MAXLINE];char str[INET_ADDRSTRLEN];int i, n;listenfd = socket(AF_INET, SOCK_STREAM, 0);int opt = 1;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));listen(listenfd, 20);printf("Accepting connections ...\n");while (1) {cliaddr_len = sizeof(cliaddr);connfd = accept(listenfd,(struct sockaddr *)&cliaddr, &cliaddr_len);//while (1){n = read(connfd, buf, MAXLINE);if (n == 0) {printf("the other side has been closed.\n");break;}printf("received from %s at PORT %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));for (i = 0; i //这里故意不关闭socket,或者是在close之前加上一个sleep都可以//sleep(5);//close(connfd);}}client.c:#include#include#include#include#include#include#define MAXLINE 80#define SERV_PORT 8000int main(int argc, char *argv[]){struct sockaddr_in servaddr;char buf[MAXLINE];int sockfd, n;char *str;if (argc != 2) { fputs("usage: ./client message\n", stderr);exit(1);}str = argv[1];sockfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);servaddr.sin_port = htons(SERV_PORT);connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));write(sockfd, str, strlen(str));n = read(sockfd, buf, MAXLINE);printf("Response from server:\n");write(STDOUT_FILENO, buf, n);write(STDOUT_FILENO, "\n", 1);close(sockfd);return 0;}结果如下:debian-wangyao:~$ ./client aResponse from server:Adebian-wangyao:~$ ./client bResponse from server:Bdebian-wangyao:~$ ./client cResponse from server:Cdebian-wangyao:~$ netstat -antp | grep CLOSE_WAIT(Not all processes could be identified, non-owned process infowill not be shown, you would have to be root to see it all.)tcp 1 0 127.0.0.1:8000 127.0.0.1:58309 CLOSE_WAIT 6979/servertcp 1 0 127.0.0.1:8000 127.0.0.1:58308 CLOSE_WAIT 6979/servertcp 1 0 127.0.0.1:8000 127.0.0.1:58307 CLOSE_WAIT 6979/server解决方法:基本的思想就是要检测出对方已经关闭的socket,然后关闭它。

Linux下Socket编程的端口问题(Address+already+in+use)

Linux下Socket编程的端口问题(Address+already+in+use)

Linux下Socket编程的端口问题( Bind(): Address already in use )转载请注明 原文: /xl_xunzhao/archive/2008/10/23/3130037.aspx最近在开发一个Linux下的聊天软件,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误:Cann't bind server socket !: Address already in use虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,很是麻烦。

昨天晚上无意间浏览到IBM网站上的一篇题为《 Linux 个隐患》的文章,恍然大悟,今天试了一下,果然解决问题,在此表示套接字编程中的 5感谢,也希望更多的coder看到这篇文章,避免出错。

主要代码为:现在我每次用Ctrl+C强制结束进程后,用netstat和ps都还能看到端口在使用中,但运行程序不会出现“Address already in use”的错误了,实现了端口的重用。

以下是原文中的第三个隐患--地址使用错误地址使用错误(EADDRINUSE)您可以使用 bind API 函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。

可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。

也可以在客户端设置中使用这个函数,以便限制应当供出去的连接所使用的接口。

bind 最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。

bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。

该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态TIME_WAIT 引起。

linux网络编程socketbindfailed问题解决

linux网络编程socketbindfailed问题解决

linux⽹络编程socketbindfailed问题解决具体介绍例如以下:bind 普遍遭遇的问题是试图绑定⼀个已经在使⽤的port。

该陷阱是或许没有活动的套接字存在,但仍然禁⽌绑定port(bind 返回EADDRINUSE)。

它由 TCP 套接字状态 TIME_WAIT 引起。

该状态在套接字关闭后约保留 2 到 4 分钟。

在 TIME_WAIT 状态退出之后,套接字被删除,该地址才⼲被⼜⼀次绑定⽽不出问题。

等待 TIME_WAIT 结束可能是令⼈恼⽕的⼀件事。

特别是假设您正在开发⼀个套接字server。

就须要停⽌server来做⼀些修改,然后重新启动。

幸运的是,有⽅法能够避开 TIME_WAIT 状态。

能够给套接字应⽤ SO_REUSEADDR 套接字选项,以便port能够⽴即重⽤。

考虑清单 3 的样例。

在绑定地址之前。

我以 SO_REUSEADDR 选项调⽤ setsockopt。

为了同意地址重⽤,我设置整型參数(on)为 1 (不然,能够设为 0 来禁⽌地址重⽤)。

清单 3.使⽤ SO_REUSEADDR 套接字选项避免地址使⽤错误int sock, ret, on;struct sockaddr_in servaddr;/* Create a new stream (TCP) socket */sock = socket( AF_INET, SOCK_STREAM, 0 ):/* Enable address reuse */on = 1;ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );/* Allow connections to port 8080 from any available interface */memset( &servaddr, 0, sizeof(servaddr) );servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl( INADDR_ANY );servaddr.sin_port = htons( 45000 );/* Bind to the address (interface/port) */ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );在应⽤了 SO_REUSEADDR 选项之后,bind API 函数将同意地址的马上重⽤。

Linux系统调用跟踪和进程错误退出分析

Linux系统调用跟踪和进程错误退出分析

2019,55(6)1引言复杂的应用程序会在执行期间产生多个子进程或者线程,这些进程还有可能通过网络和其他进程进行通信。

分析此类应用程序的出错原因,需要动态地发现并跟踪,此应用程序创建的子进程以及和这些进程通过网络通信的其他进程。

在Linux 系统中有ftrace 、systemtap 、gdb 、strace 等多种工具可以跟踪系统调用信息。

ftrace [1]采用静态trace_point [2]的方法,在系统调用分发的进入和返回代码处对系统调用的进入和返回信息进行了采集,其对系统调用的参数和返回值没有做任何解析[3]。

systemtap [4]利用kprobe 和kretprobe [5]对系统调用处理函数的调用和返回信息进行了采集,其可以通过argstr 变量输出系统调用参数信息。

gdb 的catch syscall 命令和strace 工具,利用ptrace [6]Linux 系统调用跟踪和进程错误退出分析毛英明1,陆慧梅1,向勇21.北京理工大学计算机学院,北京1000812.清华大学计算机科学与技术系,北京100084摘要:现有的Linux 系统调用跟踪工具存在跟踪上下文信息不全、无法高效地对通过网络通信的多进程应用程序进行跟踪以及跟踪结果缺少图形化展现的问题。

通过扩展Linux 系统调用跟踪工具strace ,实现了启发式跟踪工具heuristic-strace ,其能够实时发现和自动跟踪应用程序中通过网络通信的进程,形成进程创建关系图、进程网络通信关系图,并结合系统调用的栈回溯信息,定位进程的错误退出原因。

实验结果表明,此工具对能对典型的GUI 和网络应用软件进行跟踪,引入的性能开销比较低,并能保证被跟踪软件的正常交互。

关键词:Linux 系统调用;启发式跟踪;网络通信;进程错误退出分析文献标志码:A 中图分类号:TP 316.81doi :10.3778/j.issn.1002-8331.1805-0105毛英明,陆慧梅,向勇.Linux 系统调用跟踪和进程错误退出分析.计算机工程与应用,2019,55(6):57-66.MAO Yingming,LU Huimei,XIANG Yong.Linux syscall trace and process error exit puter Engineering and Applications,2019,55(6):57-66.Linux Syscall Trace and Process Error Exit AnalysisMAO Yingming 1,LU Huimei 1,XIANG Yong 21.School of Computer Science and Technology,Beijing Institute of Technology,Beijing 100081,China2.Department of Computer Science and Technology,Tsinghua University,Beijing 100084,ChinaAbstract :The existing Linux syscall tracing tools can ’t effectively trace multi process applications that communicate with other processes through network.The tracing result ’s context information is incomplete and lacks of graphical dis-play.So a new tracing tool named heuristic-strace is designed based on the existing syscall tracing tool strace.It can auto-matically find and trace the processes that communicate through network.Moreover,it can display the tracing result in the form of process creation graph and network communication bined with the stack trace info,it can locate the process error exit reason.The experimental results show that this tool can trace typical GUI and network applications with lower performance overhead and ensure normal interact with the traced software.Key words :Linux syscall;heuristic trace;network communication;process error exit analysis基金项目:核高基项目(No.2012ZX01039-004-41,No.2012ZX01039-003)。

Socket编程协议错误代码解析

Socket编程协议错误代码解析

10004‎—WSAEI‎N TR函数调用中‎断。

该错误表明‎由于对WS‎A Canc‎elBlo‎cking‎C all的‎调用,造成了一次‎调用被强行‎中断。

10009‎—WSAEB‎A DF文件句柄错‎误。

该错误表明‎提供的文件‎句柄无效。

在Micr‎o soft‎W i ndo‎wsCE下‎,socke‎t函数可能‎返回这个错‎误,表明共享串‎口处于“忙”状态。

10013‎—WSAEA‎C CES权限被拒。

尝试对套接‎字进行操作‎,但被禁止。

若试图在s‎e ndto‎或WSAS‎e ndTo‎中使用一个‎广播地址,但是尚未用‎s etso‎ckopt‎和SO_B‎R OADC‎A ST这两‎个选项设置‎广播权限,便会产生这‎类错误。

10014‎—WSAEF‎A ULT地址无效。

传给Win‎sock函‎数的指针地‎址无效。

若指定的缓‎冲区太小,也会产生这‎个错误。

10022‎—WSAEI‎N V AL参数无效。

指定了一个‎无效参数。

例如,假如为WS‎A Ioct‎l调用指定‎了一个无效‎控制代码,便会产生这‎个错误。

另外,它也可能表‎明套接字当‎前的状态有‎错,例如在一个‎目前没有监‎听的套接字‎上调用ac‎cept或‎W SAA c‎cept。

10024‎—WSAEM‎F ILE打开文件过‎多。

提示打开的‎套接字太多‎了。

通常,Micro‎soft提‎供者只受到‎系统内可用‎资源数量的‎限制。

10035‎—WSAEW‎O ULDB‎L OCK资源暂时不‎可用。

对非锁定套‎接字来说,如果请求操‎作不能立即‎执行的话,通常会返回‎这个错误。

比如说,在一个非暂‎停套接字上‎调用con‎nect,就会返回这‎个错误。

因为连接请‎求不能立即‎执行。

10036‎—WSAEI‎N PROG‎R ESS操作正在进‎行中。

当前正在执‎行非锁定操‎作。

一般来说不‎会出现这个‎错误,除非正在开‎发16位W‎i nsoc‎k应用程序‎。

Socket编程协议错误代码解析

Socket编程协议错误代码解析

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函数)的进程中时,也会出现这个错误。

Linux中socket错误编码表errno

Linux中socket错误编码表errno

Linux中socket错误编码表errno最近在网络编程使用的过程中,发现errno会经常使用。

因此决定在此做个留用,以备以后使用。

虽然errno是非线程安全的,但是可以通过几种机制保证其安全。

最近在使用的过程中获得了errno,程序无法执行,也不知道如何解决问题。

因此,理解每一个返回的errno整数值的含义是很重要的。

这个我们可以通过strerror函数来实现。

strerror(返回整数errno对应的错误原因的描述字符串)所需头文件: #include函数声明: char * strerror(int errnum);输入:整数errno输出:返回描述错误原因的字符串指针功能:用来依参数errnum 的错误代码来查询其错误原因的描述字符串,然后将该字符串指针返回。

示例:#include#include#define NUM 150int main(void){int i;for ( i=0; i {printf( "%d:%s\n", i, strerror(i) );}return 0;}运行结果:0:Success1:Operation not permitted2:No such file or directory3:No such process4:Interrupted system call5:Input/output error6:No such device or address7:Argument list too long8:Exec format error9:Bad file descriptor10:No child processes11:Resource temporarily unavailable 12:Cannot allocate memory13:Permission denied14:Bad address15:Block device required16:Device or resource busy17:File exists18:Invalid cross-device link19:No such device20:Not a directory21:Is a directory22:Invalid argument23:Too many open files in system 24:Too many open files25:Inappropriate ioctl for device 26:Text file busy27:File too large28:No space left on device29:Illegal seek30:Read-only file system31:Too many links32:Broken pipe33:Numerical argument out of domain 34:Numerical result out of range 35:Resource deadlock avoided36:File name too long37:No locks available38:Function not implemented39:Directory not empty40:Too many levels of symbolic links 41:Unknown error 4142:No message of desired type43:Identifier removed44:Channel number out of range 45:Level 2 not synchronized46:Level 3 halted47:Level 3 reset48:Link number out of range49:Protocol driver not attached50:No CSI structure available51:Level 2 halted52:Invalid exchange53:Invalid request descriptor54:Exchange full55:No anode56:Invalid request code57:Invalid slot58:Unknown error 5859:Bad font file format60:Device not a stream61:No data available62:Timer expired63:Out of streams resources64:Machine is not on the network65:Package not installed66:Object is remote67:Link has been severed68:Advertise error69:Srmount error70:Communication error on send71:Protocol error72:Multihop attempted73:RFS specific error74:Bad message75:Value too large for defined data type76:Name not unique on network77:File descriptor in bad state78:Remote address changed79:Can not access a needed shared library80:Accessing a corrupted shared library81:.lib section in a.out corrupted82:Attempting to link in too many shared libraries 83:Cannot exec a shared library directly84:Invalid or incomplete multibyte or wide character 85:Interrupted system call should be restarted 86:Streams pipe error87:Too many users88:Socket operation on non-socket89:Destination address required90:Message too long91:Protocol wrong type for socket92:Protocol not available93:Protocol not supported94:Socket type not supported95:Operation not supported96:Protocol family not supported97:Address family not supported by protocol98:Address already in use99:Cannot assign requested address100:Network is down101:Network is unreachable102:Network dropped connection on reset103:Software caused connection abort104:Connection reset by peer105:No buffer space available106:Transport endpoint is already connected 107:Transport endpoint is not connected108:Cannot send after transport endpoint shutdown 109:Too many references: cannot splice110:Connection timed out111:Connection refused112:Host is down113:No route to host114:Operation already in progress115:Operation now in progress116:Stale NFS file handle117:Structure needs cleaning118:Not a XENIX named type file119:No XENIX semaphores available 120:Is a named type file121:Remote I/O error122:Disk quota exceeded123:No medium found124:Wrong medium type125:Operation canceled126:Required key not available 127:Key has expired128:Key has been revoked129:Key was rejected by service 130:Owner died131:State not recoverable132:Unknown error 132133:Unknown error 133134:Unknown error 134135:Unknown error 135136:Unknown error 136137:Unknown error 137138:Unknown error 138139:Unknown error 139140:Unknown error 140141:Unknown error 141142:Unknown error 142143:Unknown error 143144:Unknown error 144145:Unknown error 145146:Unknown error 146147:Unknown error 147148:Unknown error 148149:Unknown error 149通过这个我们终于理解errno的含义了。

socket 读写 超时 详解

socket 读写 超时 详解

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常见错误代码解析

socket常见错误代码解析

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這個錯誤訊息。

linuxc之解决使用socket函数返回为0的问题

linuxc之解决使用socket函数返回为0的问题

linuxc之解决使用socket函数返回为0的问题
1、问题:
在 linux 平台下写socket,实现简单的tcp通信,服务端第一次调用 socket函数返回 0
2、找原因:
我的代码是这样写的
if ((server_sockfd = socket(AF_INET,SOCK_STREAM, 0) < 0));
特么总是返回0,日了狗
自找方法一:
到网上找为什么socket函数返回0,5分钟过去,没反应
自找方法二:
到网上找linux socket tcp编程
然后得到代码,然后输入终端测试,发现socket返回是3,日了狗,然后再去缩小范围,只执行2行代码,一行实现socket,一行打印结果,依然是3,日了狗,然后再把自己
写的代码也只执行这2行,我插,依然是0,奔溃了,难道socket 还受终端影响,不应该啊,然后果断问旁边做服务端开发的,当然也是搞安卓的,然后我让他看的时候,发现代码写错,那个< 写错位置了,尼玛,3 < 0 否,然后把0给了这个server_sockfd 为0,又因为0 不小于 0,所以代码往下执行
if ((server_sockfd = socket(AF_INET,SOCK_STREAM, 0)) < 0);
3、总结
以后千万不要犯这种傻逼问题,代码要写好。

socket错误详解

socket错误详解

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)时无数据排队要从套接字读取。

Linux socket错误分析

Linux socket错误分析

Linux网络编程socket错误分析socket错误码:EINTR:4阻塞的操作被取消阻塞的调用打断。

如设置了发送接收超时,就会遇到这种错误。

只能针对阻塞模式的socket。

读,写阻塞的socket时,-1返回,错误号为INTR。

另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。

如果recv 的返回值为0,那表明连接已经断开,接收操作也应该结束。

ETIMEOUT:1101、操作超时。

一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。

2、服务器做了读数据做了超时限制,读时发生了超时。

3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。

此时客户TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务TCP 获得一个ACK 分节。

当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回ETIMEDOUT 错误。

如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是EHOSTUNREACH 或ENETUNREACH。

当服务器重新启动后,由于TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应RST。

如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置SO_KEEPALIVE Socket 选项,或实现某些心跳函数。

EAGAIN:1、Send返回值小于要发送的数据数目,会返回EAGAIN和EINTR。

2、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发EAGAIN,有可能返回0表示TCP连接已被关闭。

3、当socket是非阻塞时,如返回此错误,表示写缓冲队列已满,可以做延时后再重试.4、在Linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno 代码为11(EAGAIN),表明在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就可以。

Socket的错误码和描述

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux网络编程socket错误分析socket错误码:EINTR:4阻塞的操作被取消阻塞的调用打断。

如设置了发送接收超时,就会遇到这种错误。

只能针对阻塞模式的socket。

读,写阻塞的socket时,-1返回,错误号为INTR。

另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。

如果recv 的返回值为0,那表明连接已经断开,接收操作也应该结束。

ETIMEOUT:1101、操作超时。

一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。

2、服务器做了读数据做了超时限制,读时发生了超时。

3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。

此时客户TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务TCP 获得一个ACK 分节。

当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回ETIMEDOUT 错误。

如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是EHOSTUNREACH 或ENETUNREACH。

当服务器重新启动后,由于TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应RST。

如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置SO_KEEPALIVE Socket 选项,或实现某些心跳函数。

EAGAIN:1、Send返回值小于要发送的数据数目,会返回EAGAIN和EINTR。

2、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发EAGAIN,有可能返回0表示TCP连接已被关闭。

3、当socket是非阻塞时,如返回此错误,表示写缓冲队列已满,可以做延时后再重试.4、在Linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno 代码为11(EAGAIN),表明在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就可以。

对非阻塞socket而言,EAGAIN不是一种错误。

EPIPE:1、Socket 关闭,但是socket号并没有置-1。

继续在此socket上进行send和recv,就会返回这种错误。

这个错误会引发SIGPIPE信号,系统会将产生此EPIPE错误的进程杀死。

所以,一般在网络程序中,首先屏蔽此消息,以免发生不及时设置socket进程被杀死的情况。

2、write(..) on a socket that has been closed at the other end will cause a SIGPIPE.3、错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务TCP 写入更多数据时,内核将向客户进程发送SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行core dump)。

结合上边的ECONNRESET 错误可知,向一个FIN_WAIT2 状态的服务TCP(已ACK 响应FIN 分节)写入数据不成问题,但是写一个已接收了RST 的Socket 则是一个错误。

EBADF:read(..) or write(..) on a locally closed socket will return EBADFEFAULT:地址错误。

EBUSY:ECONNREFUSED:1、拒绝连接。

一般发生在连接建立时。

拔服务器端网线测试,客户端设置keep alive时,recv较快返回0,先收到ECONNREFUSED (Connection refused)错误码,其后都是ETIMEOUT。

2、an error returned from connect(), so it can only occur in a client (if a client is defined as the party that initiates the connectionECONNRESET:1、在客户端服务器程序中,客户端异常退出,并没有回收关闭相关的资源,服务器端会先收到ECONNRESET错误,然后收到EPIPE错误。

2、连接被远程主机关闭。

有以下几种原因:远程主机停止服务,重新启动;当在执行某些操作时遇到失败,因为设置了“keep alive”选项,连接被关闭,一般与ENETRESET一起出现。

3、远程端执行了一个“hard”或者“abortive”的关闭。

应用程序应该关闭socket,因为它不再可用。

当执行在一个UDP socket上时,这个错误表明前一个send操作返回一个ICMP “port unreachable”信息。

4、如果client关闭连接,server端的select并不出错(不返回-1,使用select对唯一一个socket 进行non- blocking检测),但是写该socket就会出错,用的是send.错误号:ECONNRESET.读(recv)socket并没有返回错误。

5、该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在服务进程较客户进程提前终止。

当服务进程终止时会向客户TCP 发送FIN 分节,客户TCP 回应ACK,服务TCP 将转入FIN_WAIT2 状态。

此时如果客户进程没有处理该FIN (如阻塞在其它调用上而没有关闭Socket 时),则客户TCP 将处于CLOSE_WAIT 状态。

当客户进程再次向FIN_WAIT2 状态的服务TCP 发送数据时,则服务TCP 将立刻响应RST。

一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,往往会等待从网络IO接收数据,很典型的如read 或readline 调用,此时由于执行时序的原因,如果该调用发生在RST 分节收到前执行的话,那么结果是客户进程会得到一个非预期的EOF 错误。

此时一般会输出“server terminated prematurely”-“服务器过早终止”错误。

EINV AL:无效参数。

提供的参数非法。

有时也会与socket的当前状态相关,如一个socket并没有进入listening状态,此时调用accept,就会产生EINV AL错误。

EMFILE:打开了太多的socket。

对进程或者线程而言,每种实现方法都有一个最大的可用socket数目处理,或者是全局的,或者是局部的。

EWOULDBLOCK:EAGAIN资源暂时不可用。

这个错误是从对非阻塞socket进行的不能立即结束的操作返回的,如当没有数据在队列中可以读时,调用recv。

并不是fatal错误,稍后操作可以被重复。

调用在一个非阻塞的SOCK_STREAM socket 上调用connect时会产生这个错误,因为有时连接建立必须消耗一定的时间。

ENOTCONN在一个没有建立连接的socket上,进行read,write操作会返回这个错误。

出错的原因是socket没有标识地址。

Setsoc也可能会出错。

ECONNRESETConnection reset by peer.连接被远程主机关闭。

有以下几种原因:远程主机停止服务,重新启动;当在执行某些操作时遇到失败,因为设置了“keep alive”选项,连接被关闭,一般与ENETRESET一起出现。

ECONNABORTED1、软件导致的连接取消。

一个已经建立的连接被host方的软件取消,原因可能是数据传输超时或者是协议错误。

2、该错误被描述为“software caused connection abort”,即“软件引起的连接中止”。

原因在于当服务和客户进程在完成用于TCP 连接的“三次握手”后,客户TCP 却发送了一个RST (复位)分节,在服务进程看来,就在该连接已由TCP 排队,等着服务进程调用accept 的时候RST 却到达了。

POSIX 规定此时的errno 值必须ECONNABORTED。

源自Berkeley 的实现完全在内核中处理中止的连接,服务进程将永远不知道该中止的发生。

服务器进程一般可以忽略该错误,直接再次调用accept。

当TCP协议接收到RST数据段,表示连接出现了某种错误,函数read将以错误返回,错误类型为ECONNERESET。

并且以后所有在这个套接字上的读操作均返回错误。

错误返回时返回值小于0。

ENETUNREACH网络不可达。

Socket试图操作一个不可达的网络。

这意味着local的软件知道没有路由到达远程的host。

ENETRESET网络重置时丢失连接。

由于设置了"keep-alive"选项,探测到一个错误,连接被中断。

在一个已经失败的连接上试图使用setsockopt操作,也会返回这个错误。

EINPROGRESS:操作正在进行中。

一个阻塞的操作正在执行。

ENOTSOCK:在非socket上执行socket操作。

EDESTADDRREQ:需要提供目的地址。

在一个socket上的操作需要提供地址。

如往一个ADDR_ANY 地址上进行sendto操作会返回这个错误。

EMSGSIZE:消息体太长。

发送到socket上的一个数据包大小比内部的消息缓冲区大,或者超过别的网络限制,或是用来接收数据包的缓冲区比数据包本身小。

EPROTOTYPE协议类型错误。

标识了协议的Socket函数在不支持的socket上进行操作。

如ARPA Internet UDP协议不能被标识为SOCK_STREAM socket类型。

ENOPROTOOPT该错误不是一个Socket 连接相关的错误。

errno 给出该值可能由于,通过getsockopt 系统调用来获得一个套接字的当前选项状态时,如果发现了系统不支持的选项参数就会引发该错误。

EPROTONOSUPPORT不支持的协议。

系统中没有安装标识的协议,或者是没有实现。

如函数需要SOCK_DGRAM socket,但是标识了stream protocol.。

ESOCKTNOSUPPORTSocket类型不支持。

指定的socket类型在其address family中不支持。

如可选选中选项SOCK_RAW,但实现并不支持SOCK_RAW sockets。

EOPNOTSUPPOperation not supported.The attempted operation is not supported for the type of object referenced. Usually this occurs when a socket descriptor to a socket that cannot support this operation, for example, trying to accept a connection on a datagram socket.EPFNOSUPPORTProtocol family not supported.The protocol family has not been configured into the system or no implementation for it exists. Has a slightly different meaning to EAFNOSUPPORT, but is interchangeable in most cases, and all Windows Sockets functions that return one of these specify EAFNOSUPPORT.EAFNOSUPPORTAddress family not supported by protocol family.An address incompatible with the requested protocol was used. All sockets are created with an associated "address family" (i.e. AF_INET for Internet Protocols) and a generic protocol type (i.e. SOCK_STREAM). This error will be returned if an incorrect protocol is explicitly requested in the socket call, or if an address of the wrong family is used for a socket, e.g. in sendto.EADDRINUSEAddress already in use.Only one usage of each socket address (protocol/IP address/port) is normally permitted. This error occurs if an application attempts to bind a socket to an IP address/port that has already been used for an existing socket, or a socket that wasn't closed properly, or one that is still in the process of closing. For server applications that need to bind multiple sockets to the same port number, consider using setsockopt(SO_REUSEADDR). Client applications usually need not call bind at all - connect will choose an unused port automatically. When bind is called with a wild-card address (involving ADDR_ANY), a EADDRINUSE error could be delayed until the specific address is "committed." This could happen with a call to other function later, including connect, listen, Connect or JoinLeaf.EADDRNOTA V AILCannot assign requested address.The requested address is not valid in its context. Normally results from an attempt to bind to an address that is not valid for the local machine. This can also result from connect, sendto, Connect, JoinLeaf, or SendTo when the remote address or port is not valid for a remote machine (e.g. address or port 0).ENETDOWNNetwork is down.A socket operation encountered a dead network. This could indicate a serious failure of the network system (i.e. the protocol stack that the WinSock DLL runs over), the network interface, or the local network itself.ENOBUFSNo buffer space available.An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.EISCONNSocket is already connected.A connect request was made on an already connected socket. Some implementations also return this error if sendto is called on a connected SOCK_DGRAM socket (For SOCK_STREAM sockets, the to parameter in sendto is ignored), although other implementations treat this as a legal occurrence.连接过程可能出现的错误情况有:(1)如果客户机TCP协议没有接收到对它的SYN数据段的确认,函数以错误返回,错误类型为ETIMEOUT。

相关文档
最新文档