• 【转载】Linux中socket 错误编码表 errno


    原文链接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=116213&id=3376727

    最近在网络编程使用的过程中,发现errno会经常使用。因此决定在此做个留用,以备以后使用。。。

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

     最近在使用的过程中获得了errno,程序无法执行,也不知道如何解决问题。因此,理解每一个返回的errno整数值的含义是很重要的。。

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

    strerror(返回整数errno对应的错误原因的描述字符串)

    所需头文件:  #include
    函数声明:    char * strerror(int errnum);

    输入:          整数errno

    输出:         返回描述错误原因的字符串指针
    功能:         用来依参数errnum 的错误代码来查询其错误原因的描述字符串,然后将该字符串指针返回。
    示例:
    #include 
    #include 

    #define NUM    150
    int main(void)
    {
        int i;    
        for ( i=0; i<num; i++="" )<br="">    {
            printf( "%d:%s ", i, strerror(i) );
        }       
        return 0;
    }

    运行结果:

    0:Success
    1:Operation not permitted
    2:No such file or directory
    3:No such process
    4:Interrupted system call
    5:Input/output error
    6:No such device or address
    7:Argument list too long
    8:Exec format error
    9:Bad file descriptor
    10:No child processes
    11:Resource temporarily unavailable
    12:Cannot allocate memory
    13:Permission denied
    14:Bad address
    15:Block device required
    16:Device or resource busy
    17:File exists
    18:Invalid cross-device link
    19:No such device
    20:Not a directory
    21:Is a directory
    22:Invalid argument
    23:Too many open files in system
    24:Too many open files
    25:Inappropriate ioctl for device
    26:Text file busy
    27:File too large
    28:No space left on device
    29:Illegal seek
    30:Read-only file system
    31:Too many links
    32:Broken pipe
    33:Numerical argument out of domain
    34:Numerical result out of range
    35:Resource deadlock avoided
    36:File name too long
    37:No locks available
    38:Function not implemented
    39:Directory not empty
    40:Too many levels of symbolic links
    41:Unknown error 41
    42:No message of desired type
    43:Identifier removed
    44:Channel number out of range
    45:Level 2 not synchronized
    46:Level 3 halted
    47:Level 3 reset
    48:Link number out of range
    49:Protocol driver not attached
    50:No CSI structure available
    51:Level 2 halted
    52:Invalid exchange
    53:Invalid request descriptor
    54:Exchange full
    55:No anode
    56:Invalid request code
    57:Invalid slot
    58:Unknown error 58
    59:Bad font file format
    60:Device not a stream
    61:No data available
    62:Timer expired
    63:Out of streams resources
    64:Machine is not on the network
    65:Package not installed
    66:Object is remote
    67:Link has been severed
    68:Advertise error
    69:Srmount error
    70:Communication error on send
    71:Protocol error
    72:Multihop attempted
    73:RFS specific error
    74:Bad message
    75:Value too large for defined data type
    76:Name not unique on network
    77:File descriptor in bad state
    78:Remote address changed
    79:Can not access a needed shared library
    80:Accessing a corrupted shared library
    81:.lib section in a.out corrupted
    82:Attempting to link in too many shared libraries
    83:Cannot exec a shared library directly
    84:Invalid or incomplete multibyte or wide character
    85:Interrupted system call should be restarted
    86:Streams pipe error
    87:Too many users
    88:Socket operation on non-socket
    89:Destination address required
    90:Message too long
    91:Protocol wrong type for socket
    92:Protocol not available
    93:Protocol not supported
    94:Socket type not supported
    95:Operation not supported
    96:Protocol family not supported
    97:Address family not supported by protocol
    98:Address already in use
    99:Cannot assign requested address
    100:Network is down
    101:Network is unreachable
    102:Network dropped connection on reset
    103:Software caused connection abort
    104:Connection reset by peer
    105:No buffer space available
    106:Transport endpoint is already connected
    107:Transport endpoint is not connected
    108:Cannot send after transport endpoint shutdown
    109:Too many references: cannot splice
    110:Connection timed out
    111:Connection refused
    112:Host is down
    113:No route to host
    114:Operation already in progress
    115:Operation now in progress
    116:Stale NFS file handle
    117:Structure needs cleaning
    118:Not a XENIX named type file
    119:No XENIX semaphores available
    120:Is a named type file
    121:Remote I/O error
    122:Disk quota exceeded
    123:No medium found
    124:Wrong medium type
    125:Operation canceled
    126:Required key not available
    127:Key has expired
    128:Key has been revoked
    129:Key was rejected by service
    130:Owner died
    131:State not recoverable
    132:Unknown error 132
    133:Unknown error 133
    134:Unknown error 134
    135:Unknown error 135
    136:Unknown error 136
    137:Unknown error 137
    138:Unknown error 138
    139:Unknown error 139
    140:Unknown error 140
    141:Unknown error 141
    142:Unknown error 142
    143:Unknown error 143
    144:Unknown error 144
    145:Unknown error 145
    146:Unknown error 146
    147:Unknown error 147
    148:Unknown error 148
    149:Unknown error 149

    通过这个我们终于理解errno的含义了。。那天做的一个使用非阻塞connect式爬虫,无论如何也不好使,也不知道怎么解决,程序并没有出现段错误,最终定位在write套接字时就退出,而通过FD_ISSET测试此套接字可写,于是不知道怎么解决了。通过捕捉errno值,发现是104.而如果当时我可以知道errno=104是指“Connection reset by peer”,那么我就知道了网络爬虫式客户端需要增加对于SIGPIPE信号的处理了。。因为SIGPIPE默认处理方式是退出,改成自己添加信号处理函数或者使用忽略就可以了。。。

    所以列出这些信息,一方面能对大家有所帮助,另一方面方便以后查询。

       1#ifndef _ASM_GENERIC_ERRNO_BASE_H
       2#define _ASM_GENERIC_ERRNO_BASE_H
       3
       4#define EPERM            1      /* Operation not permitted */
       5#define ENOENT           2      /* No such file or directory */
       6#define ESRCH            3      /* No such process */
       7#define EINTR            4      /* Interrupted system call */
       8#define EIO              5      /* I/O error */
       9#define ENXIO            6      /* No such device or address */
      10#define E2BIG            7      /* Argument list too long */
      11#define ENOEXEC          8      /* Exec format error */
      12#define EBADF            9      /* Bad file number */
      13#define ECHILD          10      /* No child processes */
      14#define EAGAIN          11      /* Try again */
      15#define ENOMEM          12      /* Out of memory */
      16#define EACCES          13      /* Permission denied */
      17#define EFAULT          14      /* Bad address */
      18#define ENOTBLK         15      /* Block device required */
      19#define EBUSY           16      /* Device or resource busy */
      20#define EEXIST          17      /* File exists */
      21#define EXDEV           18      /* Cross-device link */
      22#define ENODEV          19      /* No such device */
      23#define ENOTDIR         20      /* Not a directory */
      24#define EISDIR          21      /* Is a directory */
      25#define EINVAL          22      /* Invalid argument */
      26#define ENFILE          23      /* File table overflow */
      27#define EMFILE          24      /* Too many open files */
      28#define ENOTTY          25      /* Not a typewriter */
      29#define ETXTBSY         26      /* Text file busy */
      30#define EFBIG           27      /* File too large */
      31#define ENOSPC          28      /* No space left on device */
      32#define ESPIPE          29      /* Illegal seek */
      33#define EROFS           30      /* Read-only file system */
      34#define EMLINK          31      /* Too many links */
      35#define EPIPE           32      /* Broken pipe */
      36#define EDOM            33      /* Math argument out of domain of func */
      37#define ERANGE          34      /* Math result not representable */
      38
      39#endif

  • 相关阅读:
    oracle sql developer连接信息的保存位置
    (转) Java EE 6无法安装的解决方法
    如何结合使用 Subversion 和 Eclipse
    ASUS P8H61MLE 硬刷激活win7旗舰版
    pb 版本控制
    Subversion Edge by Collabnet 的用户名密码
    (原)导入证书后报:错误应用程序名称: lmadmin.exe,版本: 11.10.0.9,时间戳: 0x4f02e435
    关于Xendesktop的心得
    Eclipse 3.4插件安装方式
    Java创建线程的两个方法
  • 原文地址:https://www.cnblogs.com/tyrus/p/5676041.html
Copyright © 2020-2023  润新知