Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49636
  • 博文数量: 5
  • 博客积分: 1421
  • 博客等级: 上尉
  • 技术积分: 78
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-13 00:12
文章分类

全部博文(5)

文章存档

2010年(5)

我的朋友

分类: C/C++

2010-04-28 17:50:17

文件: errno.tar.gz
大小: 0KB
下载: 下载
不怕大家笑话,写程序有段时间了,最近才算完全搞明白errno这个变量的用法。写出来和大家分享,纯属抛砖引玉,已经会的朋
友不要笑话哈:)

errno这个变量在/usr/include/errno.h中定义。格式为
#ifndef errno
extern int errno;
#endif

故要在程序当中使用errno,要先#include 这个头文件
下面是我写的一段小程序
 
#include
#include
#include
#include
#include
int main(int argv,char *argc[])
{
    int iSocket = 0;
    struct sockaddr_in stServer;
    stServer.sin_family = AF_INET;
    stServer.sin_port = htons(6666);
    stServer.sin_addr.s_addr = inet_addr("127.0.0.1");
    memset(&stServer.sin_zero,0,8);
    if (-1 == (iSocket = socket(AF_INET,SOCK_STREAM,0)))
    {
        perror("socket");
        return -1;
    }
    if (-1 == connect(iSocket,(struct sockaddr *)&stServer,sizeof(struct sockaddr)))
    {
        printf("errno is %d\n",errno);
        if (errno == ECONNREFUSED)
            printf("ECONNREFUSED!\n");
    }
    return 0;
}
 
编译:gcc errno.c
程序运行结果:
[root@localhost errno]# ./a.out
 errno is 111
 ECONNREFUSED!
[root@localhost errno]#
 
相信大家唯一可能有点不明白的就是ECONNREFUSED这个东西怎么来的。没关系,因为我以前也不明白~~。
ECONNREFUSED的来历需要通过看man 2 connect来获得了。
在打开的文本中注意看下面这一行:
RETURN VALUE
       If the connection or binding succeeds, zero is returned.  On error, -1 is   returned, and errno is set  appropriately.
 
ERRORS
       The following are general socket errors only.  There may be other domain-  specific error codes.
       EACCES For  Unix  domain  sockets,  which  are identified by pathname:      Write permission is denied on the socket...
 
RETURN VALUE是对connect返回值的说明。成功返回0。不成功返回-1,而且errno被赋值为相应的值。在我这里就是ECONNREFUSED啦。
 
ERRORS就是解释有可能被赋值到errno中的每个选项的意思。如ECONNREFUSED的解释是:
 
ECONNREFUSED
      No one listening on the remote address.
 
 
 
另外ECONNREFUSED 为111, 是在/usr/include/asm-generic/errno.h中定义的,如下:
   #define ETIMEDOUT       110     /* Connection timed out */
   #define ECONNREFUSED    111     /* Connection refused */
   #define EHOSTDOWN       112     /* Host is down */
 
但不同的系统貌似不同,我现在用的是FC8.示例程序代码在附件中
 
 
 
 
阅读(3675) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~