当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 8 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-19 18:47 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
编程时用到了epoll想使用epoll事件中的EPOLLET
说需要将套接字设置为非堵塞的,我照作了,结果是套接字socket不能连接到服务器了
想问套接字的堵塞于非堵塞有啥区别?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-19 18:59 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
我说的不够清楚
SetSockNonBlocking(clientSocketFd);
if(connect(clientSocketFd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
cout<<"连接服务器失败!\n";
close(clientSocketFd);
return false;
}
这样连接的话就会出现问题,明明是连接上了,还是返回失败
如果不用设置堵塞连接成功,并且不会报错
指点一二


页首
 用户资料  
 
3 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-20 10:43 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
非堵塞的socket
在connect的时候是立刻返回,但是连接是要时间的,
所以有可能返回失败?


页首
 用户资料  
 
4 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-20 15:18 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
我查看资料有两种版本的设置套接字为非堵塞的
1.
/*
setnonblocking - 设置句柄为非阻塞方式
*/
int setnonblocking(int sockfd)
{
if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1) {
return -1;
}
return 0;
}
下面的是第二种方式
int opts;
opts=fcntl(nSocketFd,F_GETFL);

if(opts<0)
{
//设置非堵塞属性失败
cout<<"fcntl(sock,GETFL):设置非堵塞属性失败!";
return false;
}

opts = opts|O_NONBLOCK;

if(fcntl(nSocketFd,F_SETFL,opts)<0)

{
//设置nSocketFd为非堵塞套接字失败
cout<<"fcntl(sock,SETFL,opts):设置nSocketFd为非堵塞套接字失败!";
以上两种都对吗?还有两者有没有区别(本质上的)

return false;

}
cout<<"设置套接字的非堵塞属性成功\n";
return true;


页首
 用户资料  
 
5 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-24 21:59 

注册: 2008-11-16 20:13
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
堵塞 原文 blocking 意思是 将阻塞调用函数 直到产生结果后才返回..
就像 scanf 一样,当用户完成一次输入后才会返回..

非阻塞 socket 是不会阻塞调用函数,无论是否产生结果 都立即返回..

小规模网络应用程序 推荐 select 函数..

War3就是使用的 select函数


页首
 用户资料  
 
6 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-25 8:50 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
Wayne.viichi,
你说的我受教,要是不clocking假若我
connect(clientSocketFd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr);
它会直接返回,那如何知道是否链接成功了哪?
我试过本来在非堵塞的情况下我判断connect是否为-1,若是的话表示没有链接成功,
但是现在明明链接成功了,还返回-1
而且立刻断开了链接
这事该如何解决


页首
 用户资料  
 
7 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-26 17:34 

注册: 2008-07-10 15:08
帖子: 448
送出感谢: 0 次
接收感谢: 0 次
有人说用下面的设置socket的非堵塞属性
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
我上面的是用的
int flags = fcntl(socket, F_GETFL);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
这两句有没有区别阿?


页首
 用户资料  
 
8 楼 
 文章标题 : Re: socket的堵塞于非堵塞的区别
帖子发表于 : 2008-11-27 12:50 

注册: 2007-05-26 18:15
帖子: 6
送出感谢: 0 次
接收感谢: 0 次
看unp v1 说得很清楚


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 8 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译