免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: RyanPoy
打印 上一主题 下一主题

socket问题。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-06-13 09:51 |只看该作者
設置recv超時

论坛徽章:
0
12 [报告]
发表于 2007-06-13 10:13 |只看该作者
原帖由 exir 于 2007-6-12 22:38 发表于 8楼  
只accept了一次


当然只需要一次就够了。我只是做一个测试而已。

论坛徽章:
0
13 [报告]
发表于 2007-06-13 10:13 |只看该作者
原帖由 朱熹之 于 2007-6-13 09:17 发表于 10楼  
你打log出来看看,到底server是死在那一步的


不知道如何打印log,请赐教。

论坛徽章:
0
14 [报告]
发表于 2007-06-13 10:14 |只看该作者
原帖由 Arthur_ 于 2007-6-13 09:51 发表于 11楼  
設置recv超時


我设置了超时后,情况是一样的。设置超时的方法:BaseSocket.setTimeOut(...);请你看一下。不知道这样子写有没有问题。

论坛徽章:
0
15 [报告]
发表于 2007-06-13 11:27 |只看该作者
在RECV後面打印一個信息, 看看超時是否其作用.

论坛徽章:
0
16 [报告]
发表于 2007-06-13 11:57 |只看该作者
原帖由 Arthur_ 于 2007-6-13 11:27 发表于 15楼  
在RECV後面打印一個信息, 看看超時是否其作用.


我在代码中设置了超时:
int main(int argc, char* argv[])
{
    BaseSocket qsSocket;
    
    if (!qsSocket.create(_TCP))
        return -1;
    if (!qsSocket.bind((unsigned short) 8888))
        return -1;
    if (!qsSocket.listen(5))
        return -1;
    
    char* str= "Logger.default.grade=INFO;中华人民共和国";
    int len = (int) strlen(str);
    BaseSocket csock = qsSocket.accept();
    int v;
    csock.setTimeOut(2000);  // 设置超时时间

    while(true)
    {
        csock.send(len);
        csock.send(str, len);
        csock.recvInt(&v);
        printf("v = %d\n", v);
    }
    return 0;
}


然后,在recvInt的时候让客户不发送数据.到达时间后,直接走到下一行.同时,出现错误,错误号是11. 错误信息: Resource temporarily unavailable, 这个时候,程序仍然能正常运行。没有问题。而且结果也和预想的一样。这样,表示超时设置成功了。
再又做一个操作:把客户端给关掉。这个时候,服务端继续执行发送命令,出现错误。错误号是104,错误信息:Connection reset by peer. 而且,整个应用程序就down掉了。
这个也就是我说的问题所在了。如果出现socket通信错误,程序不应该全部down掉啊。
请赐教。

论坛徽章:
0
17 [报告]
发表于 2007-06-13 13:16 |只看该作者
服务端继续执行发送命令,出现错误。错误号是104,错误信息:Connection reset by peer. 而且,整个应用程序就down掉了。
=================如果在發送數據斷掉可能收到了SIGPIPE,然後斷掉

论坛徽章:
0
18 [报告]
发表于 2007-06-13 14:10 |只看该作者
原帖由 Arthur_ 于 2007-6-13 13:16 发表于 17楼  
=================如果在發送數據斷掉可能收到了SIGPIPE,然後斷掉


因为初次在linux下面写程序,对这个不是很理解。
我对上面的话的理解是:因为send数据失败,程序接收到了一个中断信号。而这个信号导致程序结束。
不知道上面的理解对不对。

1。如果不对,请更加详细的讲讲。

2。如果对,我想得看看关于捕获信号量这方面的东西了。

论坛徽章:
0
19 [报告]
发表于 2007-06-13 15:57 |只看该作者
加上了信号处理函数。
代码如下:
void dealSigPipe(int sig)
{
    printf("pipe error.");
}


然后再main方法里添加了如下代码:
if (SIG_ERR == signal(SIGPIPE, dealSigPipe))
    {
        printf("%d:%s", errno, strerror(errno));
        return -1;
    }


解决了因socket数据传送or接收失败而出现的整个程序down掉的问题。
多谢大家的帮忙。

顺便问一下。一般信号处理,是不是按照我上面的方式。或者又没有更好的方式呢?

论坛徽章:
0
20 [报告]
发表于 2007-06-13 18:19 |只看该作者
源代码没仔细看,但通过LZ的描述,估计是服务端没有处理SIGPIPE信号造成的,当对方主机进程崩溃时(在服务端看来),本地会产生一个SIGPIPE信号,系统默认处理是中止进程,建议编码处理这个信号。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP