在client端setsockopt设置 keepalive不起作用的原因
时间:2010-08-10
来源:互联网
本帖最后由 灰菲湮灭 于 2010-08-10 16:51 编辑
结构一如下:
int flag;
fun()
{
create_socket(); //里面设置keepalive
flag = 1;
}
int main() {
FD_ZERO(&rfds);
FD_SET(nl_fd, &rfds);
select();
if (FD_ISSET(nl_fd)){
fun();
}
if (flag == 1) {
write_sock();
read_sock();
}
}
结构二如下:
int flag;
fun()
{
create_socket(); //里面设置keepalive
flag = 1;
}
test()
{
write_sock();
read_sock();
}
int main() {
FD_ZERO(&rfds);
FD_SET(n_fd, &rfds);
if (flag == 1) {
FD_SET(fd, &rfds);
}
select();
if (FD_ISSET(nl_fd)){
fun();
}
if (flag == 1) {
if (FD_ISSET(nl_fd)){
test();
}
}
}
如上所示: 以上结构都有两个socket: fd和nl_fd; 结构一将fd和nl_fd都放入select,结构二只把fd放入select
在结构二中keepalive 是可以正常作用,可以发现server端异常断开。但结构一却不行。两种结构用的同一个server测试。
而且还有一点很奇怪,如果把结构一中的write_socket注掉,则可以发现异常中断。
请问这是什么原因呢?
非常感谢。
结构一如下:
int flag;
fun()
{
create_socket(); //里面设置keepalive
flag = 1;
}
int main() {
FD_ZERO(&rfds);
FD_SET(nl_fd, &rfds);
select();
if (FD_ISSET(nl_fd)){
fun();
}
if (flag == 1) {
write_sock();
read_sock();
}
}
结构二如下:
int flag;
fun()
{
create_socket(); //里面设置keepalive
flag = 1;
}
test()
{
write_sock();
read_sock();
}
int main() {
FD_ZERO(&rfds);
FD_SET(n_fd, &rfds);
if (flag == 1) {
FD_SET(fd, &rfds);
}
select();
if (FD_ISSET(nl_fd)){
fun();
}
if (flag == 1) {
if (FD_ISSET(nl_fd)){
test();
}
}
}
如上所示: 以上结构都有两个socket: fd和nl_fd; 结构一将fd和nl_fd都放入select,结构二只把fd放入select
在结构二中keepalive 是可以正常作用,可以发现server端异常断开。但结构一却不行。两种结构用的同一个server测试。
而且还有一点很奇怪,如果把结构一中的write_socket注掉,则可以发现异常中断。
请问这是什么原因呢?
非常感谢。
作者: 灰菲湮灭 发布时间: 2010-08-10
或者结构不删除write_socket,把read_socket和write_socket调换一个位置也是可以的,很奇怪,不知道为什么。。。
作者: 灰菲湮灭 发布时间: 2010-08-10
结构一:
FD_SET(nl_fd, &rfds);//这里设置了
结构二:
if (flag == 1) {
FD_SET(fd, &rfds);//这里还没设置
}
是不是还和select 的读写参数有关,不知道LZ 具体是怎么设置的
FD_SET(nl_fd, &rfds);//这里设置了
结构二:
if (flag == 1) {
FD_SET(fd, &rfds);//这里还没设置
}
是不是还和select 的读写参数有关,不知道LZ 具体是怎么设置的
作者: lqq_1229 发布时间: 2010-08-10
fun() 函数里设置flag
create_socket();里面 fd = socket();
这个程序主要有两个socket,一个fd, 一个nl_fd;
结构一里面把两个socket全加入到select里面。
结构二里面只把nl_fd加入,fd并没有加入,只是根据flag判断是否去write/read。
create_socket();里面 fd = socket();
这个程序主要有两个socket,一个fd, 一个nl_fd;
结构一里面把两个socket全加入到select里面。
结构二里面只把nl_fd加入,fd并没有加入,只是根据flag判断是否去write/read。
作者: 灰菲湮灭 发布时间: 2010-08-10
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28