领先的中文IT技术网站    IT技术从现在起飞

飞诺旗下: 技术社区 | 在线电子书 | 在线试题 | 资源下载 | 飞诺搜索 | 技术博客
用户名: 密   码:
   飞诺网 加入收藏
飞诺网 C++ 新闻频道 开发频道 系统频道 服务器 网络频道 网络安全 Java频道 C/C++ PHP开发 电子书 资源下载 社 区 博 客 在线试题
软件编程 C C++ Java VB Delphi Foxpro 汇编语言 游戏开发 移动开发 软件工程师 软工与管理 VC shell编程 C#
编程开发 JAVA C/C++ C++ VC C语言 VB C# Delphi Foxpro 汇编 shell编程 游戏开发 软件工程师 WEB开发 PHP ASP Asp.net JSP AJAX CGI JavaScript HTML CSS 数据库 MSSQL Mysql Oracle Access Sybase DB2 sql2005 Office Word Excel Powerpoint Wps 认证考试 二级C语言 三级网络 程序员 网络工程师 思科认证

您当前的位置:飞诺网 >> c/c++ >> C++技术文章

关于accept函数需要注意的一点

www.firnow.com    时间 : 2008-02-03  作者:佚名   编辑:本站 点击:   [ 评论 ]

第一次使用accept()函数时, 只是简单地看了一下函数的说明,知道了各个参数的意思,于是就写下了下面的代码(代码简化了):

 

int  socket = 0 ;
int  socket_new = 0;
int  port   = 4567;
int  lenth  = 0;
struct sockaddr_in saddr_s;
struct sockaddr_in saddr_c;

 

socket = socket(AF_INET, SOCK_STREAM, 0);   
memset(&saddr_s, 0, sizeof(saddr_s));
saddr_s.sin_family = AF_INET;
saddr_s.sin_addr.s_addr = htonl(INADDR_ANY);
saddr_s.sin_port = htons(port);
ret = bind(socket, (struct sockaddr *)&saddr_s, sizeof(saddr_s));
ret = listen(socket, 16);
lenth = sizeof(sockaddr_in)
while(1){
    socket_new = accept(socket, (struct sockaddr *)&saddr_c, &lenth);
    if (socket_new == -1) {
        if (errno == EINTR) {
            continue;
        }
        return -1;
    }
}

刚开始运行一次就正常结束了,没有出现什么异常。后来让他循环执行几次,结果发现saddr_c中的值全为0,而不是客户端的IP信息,于是就很郁闷,感觉也没什么地方不妥呀!
于是重新再看accept的参数的意义,发现lenth是一个I/O参数,传入时,是作为saddr_c的
字节数;传出时是作为返回信息的字节数。而每执行一次accept,lenth便会被初始化称0.
因此当第二次执行时,因为lenth为0,所以accept认为saddr_c的存储空间为0,因此无法保存客户端的IP信息。
    如果每次执行一次accept后,重新给lenth赋值,应该就不会出现上面的问题了。
即:
//省略
while(1){
    lenth = sizeof(sockaddr_in) //*需要放在循环里面*
    socket_new = accept(socket, (struct sockaddr *)&saddr_c, &lenth);
    if (socket_new == -1) {
        if (errno == EINTR) {
            continue;
        }
        return -1;
    }
}

于是按照上面的方法进行修改,果然第二次以后也可以正常取得客户端的IP信息了。



如果图片或页面不能正常显示请点击这里
C++技术文章推荐文章

文章评论

BBS社区热贴