socket的堵塞于非堵塞的区别

软件和网站开发以及相关技术探讨
回复
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

socket的堵塞于非堵塞的区别

#1

帖子 weihua2008 » 2008-11-19 18:47

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

Re: socket的堵塞于非堵塞的区别

#2

帖子 weihua2008 » 2008-11-19 18:59

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

Re: socket的堵塞于非堵塞的区别

#3

帖子 weihua2008 » 2008-11-20 10:43

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

Re: socket的堵塞于非堵塞的区别

#4

帖子 weihua2008 » 2008-11-20 15:18

我查看资料有两种版本的设置套接字为非堵塞的
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;
Wayne.viichi
帖子: 8
注册时间: 2008-11-16 20:13

Re: socket的堵塞于非堵塞的区别

#5

帖子 Wayne.viichi » 2008-11-24 21:59

堵塞 原文 blocking 意思是 将阻塞调用函数 直到产生结果后才返回..
就像 scanf 一样,当用户完成一次输入后才会返回..

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

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

War3就是使用的 select函数
weihua2008
帖子: 448
注册时间: 2008-07-10 15:08

Re: socket的堵塞于非堵塞的区别

#6

帖子 weihua2008 » 2008-11-25 8:50

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

Re: socket的堵塞于非堵塞的区别

#7

帖子 weihua2008 » 2008-11-26 17:34

有人说用下面的设置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);
这两句有没有区别阿?
icylord
帖子: 6
注册时间: 2007-05-26 18:15

Re: socket的堵塞于非堵塞的区别

#8

帖子 icylord » 2008-11-27 12:50

看unp v1 说得很清楚
回复