connect 是 errno 为111 115 101 22 错误分析 |
您所在的位置:网站首页 › android10111 › connect 是 errno 为111 115 101 22 错误分析 |
22:参数错误,比如ip地址不合法,没有目标端口等 101:网络不可达,比如不能ping通 111:链接被拒绝,比如目标关闭链接等 115:当链接设置为非阻塞时,目标没有及时应答,返回此错误,socket可以继续使用
附录:Linux的错误码表(errno table) _ 124 EMEDIUMTYPE_ Wrong medium type _ 123 ENOMEDIUM__ No medium found _ 122 EDQUOT___ Disk quota exceeded _ 121 EREMOTEIO__ Remote I/O error _ 120 EISNAM___ Is a named type file _ 119 ENAVAIL___ No XENIX semaphores available _ 118 ENOTNAM___ Not a XENIX named type file _ 117 EUCLEAN___ Structure needs cleaning _ 116 ESTALE___ Stale NFS file handle _ 115 EINPROGRESS +Operation now in progress _ 114 EALREADY__ Operation already in progress _ 113 EHOSTUNREACH No route to host _ 112 EHOSTDOWN__ Host is down _ 111 ECONNREFUSED Connection refused _ 110 ETIMEDOUT_ +Connection timed out _ 109 ETOOMANYREFS Too many references: cannot splice _ 108 ESHUTDOWN__ Cannot send after transport endpoint shutdown _ 107 ENOTCONN__ Transport endpoint is not connected _ 106 EISCONN___ Transport endpoint is already connected _ 105 ENOBUFS___ No buffer space available _ 104 ECONNRESET_ Connection reset by peer _ 103 ECONNABORTED Software caused connection abort _ 102 ENETRESET__ Network dropped connection on reset _ 101 ENETUNREACH_ Network is unreachable _ 100 ENETDOWN__ Network is down _ 99 EADDRNOTAVAIL Cannot assign requested address _ 98 EADDRINUSE_ Address already in use _ 97 EAFNOSUPPORT Address family not supported by protocol _ 96 EPFNOSUPPORT Protocol family not supported _ 95 EOPNOTSUPP_ Operation not supported _ 94 ESOCKTNOSUPPORT Socket type not supported _ 93 EPROTONOSUPPORT Protocol not supported _ 92 ENOPROTOOPT_ Protocol not available _ 91 EPROTOTYPE_ Protocol wrong type for socket _ 90 EMSGSIZE__ +Message too long _ 89 EDESTADDRREQ Destination address required _ 88 ENOTSOCK__ Socket operation on non-socket _ 87 EUSERS___ Too many users _ 86 ESTRPIPE__ Streams pipe error _ 85 ERESTART__ Interrupted system call should be restarted _ 84 EILSEQ___ Invalid or incomplete multibyte or wide character _ 83 ELIBEXEC__ Cannot exec a shared library directly _ 82 ELIBMAX___ Attempting to link in too many shared libraries _ 81 ELIBSCN___ .lib section in a.out corrupted _ 80 ELIBBAD___ Accessing a corrupted shared library _ 79 ELIBACC___ Can not access a needed shared library _ 78 EREMCHG___ Remote address changed _ 77 EBADFD___ File descriptor in bad state _ 76 ENOTUNIQ__ Name not unique on network _ 75 EOVERFLOW__ Value too large for defined data type _ 74 EBADMSG__ +Bad message _ 73 EDOTDOT___ RFS specific error _ 72 EMULTIHOP__ Multihop attempted _ 71 EPROTO___ Protocol error _ 70 ECOMM____ Communication error on send _ 69 ESRMNT___ Srmount error _ 68 EADV____ Advertise error _ 67 ENOLINK___ Link has been severed _ 66 EREMOTE___ Object is remote _ 65 ENOPKG___ Package not installed _ 64 ENONET___ Machine is not on the network _ 63 ENOSR____ Out of streams resources _ 62 ETIME____ Timer expired _ 61 ENODATA___ No data available _ 60 ENOSTR___ Device not a stream _ 59 EBFONT___ Bad font file format _ 57 EBADSLT___ Invalid slot _ 56 EBADRQC___ Invalid request code _ 55 ENOANO___ No anode _ 54 EXFULL___ Exchange full _ 53 EBADR____ Invalid request descriptor _ 52 EBADE____ Invalid exchange _ 51 EL2HLT___ Level 2 halted _ 50 ENOCSI___ No CSI structure available _ 49 EUNATCH___ Protocol driver not attached _ 48 ELNRNG___ Link number out of range _ 47 EL3RST___ Level 3 reset _ 46 EL3HLT___ Level 3 halted _ 45 EL2NSYNC__ Level 2 not synchronized _ 44 ECHRNG___ Channel number out of range _ 43 EIDRM____ Identifier removed _ 42 ENOMSG___ No message of desired type _ 40 ELOOP____ Too many levels of symbolic links _ 39 ENOTEMPTY_ +Directory not empty _ 38 ENOSYS___ +Function not implemented _ 37 ENOLCK___ +No locks available _ 36 ENAMETOOLONG +File name too long _ 35 EDEADLK__ +Resource deadlock avoided _ 34 ERANGE___ +Numerical result out of range _ 33 EDOM____ +Numerical argument out of domain _ 32 EPIPE___ +Broken pipe _ 31 EMLINK___ +Too many links _ 30 EROFS___ +Read-only file system _ 29 ESPIPE___ +Illegal seek _ 28 ENOSPC___ +No space left on device _ 27 EFBIG___ +File too large _ 26 ETXTBSY___ Text file busy _ 25 ENOTTY___ +Inappropriate ioctl for device _ 24 EMFILE___ +Too many open files _ 23 ENFILE___ +Too many open files in system _ 22 EINVAL___ +Invalid argument _ 21 EISDIR___ +Is a directory _ 20 ENOTDIR__ +Not a directory _ 19 ENODEV___ +No such device _ 18 EXDEV___ +Invalid cross-device link _ 17 EEXIST___ +File exists _ 16 EBUSY___ +Device or resource busy _ 15 ENOTBLK___ Block device required _ 14 EFAULT___ +Bad address _ 13 EACCES___ +Permission denied _ 12 ENOMEM___ +Cannot allocate memory _ 11 EAGAIN___ +Resource temporarily unavailable _ 10 ECHILD___ +No child processes __ 9 EBADF___ +Bad file descriptor __ 8 ENOEXEC__ +Exec format error __ 7 E2BIG___ +Argument list too long __ 6 ENXIO___ +No such device or address __ 5 EIO____ +Input/output error __ 4 EINTR___ +Interrupted system call __ 3 ESRCH___ +No such process __ 2 ENOENT___ +No such file or directory __ 1 EPERM___ +Operation not permitted #_ 0 --_____ Success
附录参考 http://fanqiang.chinaunix.net/a4/b7/20010913/0900001283.html 摘要: 讨论关于利用select()检测对方Socket关闭的问题: 仍然是本地Socket有东东可读,因为对方Socket关闭时,会发一个关闭连接 通知报文,会马上被select()检测到的。关于TCP的连接(三次握手)和关 闭(二次握手)机制,敬请参考有关TCP/IP的书籍。 不知是什么原因,UNIX好象没有提供通知进程关于Socket或Pipe对方关闭的 信号,也可能是cpu所知有限。总之,当对方关闭,一执行recv()或read(), 马上回返回-1,此时全局变量errno的值是115,相应的sys_errlist[errno] 为"Connect refused"(请参考/usr/include/sys/errno.h)。所以,在上 篇的for(;;)...select()程序块中,当有东西可读时,一定要检查recv()或 read()的返回值,返回-1时要作出关断本地Socket的处理,否则select()会 一直认为有东西读,其结果曾几令cpu伤心欲断针脚。不信你可以试试:不检 查recv()返回结果,且将收到的东东(实际没收到)写至标准输出... 在有名管道的编程中也有类似问题出现。具体处理详见拙作:发布一个有用 的Socket客户方原码。 至于主动写Socket时对方突然关闭的处理则可以简单地捕捉信号SIGPIPE并作 出相应关断本地Socket等等的处理。SIGPIPE的解释是:写入无读者方的管道。 在此不作赘述,请详man signal。 以上是cpu在作tcp/ip数据传输实验积累的经验,若有错漏,请狂炮击之。 唉,昨天在hacker区被一帮孙子轰得差点儿没短路。ren cpu(奔腾的心) z80 补充关于select在异步(非阻塞)connect中的应用,刚开始搞socket编程的时候 我一直都用阻塞式的connect,非阻塞connect的问题是由于当时搞proxy scan 而提出的呵呵 通过在网上与网友们的交流及查找相关FAQ,总算知道了怎么解决这一问题.同样 用select可以很好地解决这一问题.大致过程是这样的: 1.将打开的socket设为非阻塞的,可以用fcntl(socket, F_SETFL, O_NDELAY)完 成(有的系统用FNEDLAY也可). 2.发connect调用,这时返回-1,但是errno被设为EINPROGRESS,意即connect仍旧 在进行还没有完成. 3.将打开的socket设进被监视的可写(注意不是可读)文件集合用select进行监视, 如果可写,用 getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, sizeof(int)); 来得到error的值,如果为零,则connect成功. 在许多unix版本的proxyscan程序你都可以看到类似的过程,另外在solaris精华 区->编程技巧中有一个通用的带超时参数的connect模块. |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |