编程时用到了epoll想使用epoll事件中的EPOLLET
说需要将套接字设置为非堵塞的,我照作了,结果是套接字socket不能连接到服务器了
想问套接字的堵塞于非堵塞有啥区别?
socket的堵塞于非堵塞的区别
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: socket的堵塞于非堵塞的区别
我说的不够清楚
SetSockNonBlocking(clientSocketFd);
if(connect(clientSocketFd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
cout<<"连接服务器失败!\n";
close(clientSocketFd);
return false;
}
这样连接的话就会出现问题,明明是连接上了,还是返回失败
如果不用设置堵塞连接成功,并且不会报错
指点一二
SetSockNonBlocking(clientSocketFd);
if(connect(clientSocketFd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
cout<<"连接服务器失败!\n";
close(clientSocketFd);
return false;
}
这样连接的话就会出现问题,明明是连接上了,还是返回失败
如果不用设置堵塞连接成功,并且不会报错
指点一二
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: socket的堵塞于非堵塞的区别
非堵塞的socket
在connect的时候是立刻返回,但是连接是要时间的,
所以有可能返回失败?
在connect的时候是立刻返回,但是连接是要时间的,
所以有可能返回失败?
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: socket的堵塞于非堵塞的区别
我查看资料有两种版本的设置套接字为非堵塞的
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;
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;
-
- 帖子: 8
- 注册时间: 2008-11-16 20:13
Re: socket的堵塞于非堵塞的区别
堵塞 原文 blocking 意思是 将阻塞调用函数 直到产生结果后才返回..
就像 scanf 一样,当用户完成一次输入后才会返回..
非阻塞 socket 是不会阻塞调用函数,无论是否产生结果 都立即返回..
小规模网络应用程序 推荐 select 函数..
War3就是使用的 select函数
就像 scanf 一样,当用户完成一次输入后才会返回..
非阻塞 socket 是不会阻塞调用函数,无论是否产生结果 都立即返回..
小规模网络应用程序 推荐 select 函数..
War3就是使用的 select函数
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: socket的堵塞于非堵塞的区别
Wayne.viichi,
你说的我受教,要是不clocking假若我
connect(clientSocketFd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr);
它会直接返回,那如何知道是否链接成功了哪?
我试过本来在非堵塞的情况下我判断connect是否为-1,若是的话表示没有链接成功,
但是现在明明链接成功了,还返回-1
而且立刻断开了链接
这事该如何解决
你说的我受教,要是不clocking假若我
connect(clientSocketFd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr);
它会直接返回,那如何知道是否链接成功了哪?
我试过本来在非堵塞的情况下我判断connect是否为-1,若是的话表示没有链接成功,
但是现在明明链接成功了,还返回-1
而且立刻断开了链接
这事该如何解决
-
- 帖子: 448
- 注册时间: 2008-07-10 15:08
Re: socket的堵塞于非堵塞的区别
有人说用下面的设置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);
这两句有没有区别阿?
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);
这两句有没有区别阿?
-
- 帖子: 6
- 注册时间: 2007-05-26 18:15
Re: socket的堵塞于非堵塞的区别
看unp v1 说得很清楚