linux socket系统调用socket,accept,bind,listen,connect,send,recv等函数出错时,errno的值及其含义对应如下:
EAGAIN: Resource temporarily unavailable EWOULDBLOCK: Resource temporarily unavailable EBADF: Bad file descriptor ECONNREFUSED: Connection refused EFAULT: Bad address EINTR: Interrupted system call EINVAL: Invalid argument ENOMEM: Cannot allocate memory ENOTCONN: Transport endpoint is not connected ENOTSOCK: Socket operation on non-socket EACCES: Permission denied ECONNRESET: Connection reset by peer EDESTADDRREQ: Destination address required EMSGSIZE: Message too long ENOBUFS: No buffer space available EOPNOTSUPP: Operation not supported EPIPE: Broken pipe EPERM: Operation not permitted EADDRINUSE: Address already in use EAFNOSUPPORT: Address family not supported by protocol EALREADY: Operation already in progress EINPROGRESS: Operation now in progress EISCONN: Transport endpoint is already connected ENETUNREACH: Network is unreachable ETIMEDOUT: Connection timed out EMFILE: Too many open files ENFILE: Too many open files in system EPROTO: Protocol error EADDRINUSE: Address already in use EADDRNOTAVAIL: Cannot assign requested address ELOOP: Too many levels of symbolic links ENAMETOOLONG: File name too long ENOENT: No such file or directory ENOTDIR: Not a directory EROFS: Read-only file system EPROTONOSUPPORT: Protocol not supported
测试代码如下:
void print_sock_errors() {
int i;
#define _ITEM(i) {i, #i}
struct sock_error {
int error;
char str[32];
} errors[] = {
_ITEM(EAGAIN),
_ITEM(EWOULDBLOCK),
_ITEM(EBADF),
_ITEM(ECONNREFUSED),
_ITEM(EFAULT),
_ITEM(EINTR),
_ITEM(EINVAL),
_ITEM(ENOMEM),
_ITEM(ENOTCONN),
_ITEM(ENOTSOCK),
_ITEM(EACCES),
_ITEM(ECONNRESET),
_ITEM(EDESTADDRREQ),
_ITEM(EMSGSIZE),
_ITEM(ENOBUFS),
_ITEM(EOPNOTSUPP),
_ITEM(EPIPE),
_ITEM(EPERM),
_ITEM(EADDRINUSE),
_ITEM(EAFNOSUPPORT),
_ITEM(EALREADY),
_ITEM(EINPROGRESS),
_ITEM(EISCONN),
_ITEM(ENETUNREACH),
_ITEM(ETIMEDOUT),
_ITEM(EMFILE), //accept
_ITEM(ENFILE), //accept
_ITEM(EPROTO),
_ITEM(EADDRINUSE),
_ITEM(EADDRNOTAVAIL), //bind
_ITEM(ELOOP), //bind
_ITEM(ENAMETOOLONG), //bind
_ITEM(ENOENT), //bind
_ITEM(ENOTDIR), //bind
_ITEM(EROFS), //bind
_ITEM(EPROTONOSUPPORT), //socket
};
for(i = 0; i < sizeof(errors) / sizeof(errors[0]); i ++) {
errno = errors[i].error;
perror(errors[i].str);
}
printf("\n\n");
}
