免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2388 | 回复: 4
打印 上一主题 下一主题

[网络] 程序改错 linux 系统出现大量的TIME_WAIT,如何解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-19 13:53 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/errno.h>
#include <netinet/in.h>

int DealMsg( char *buffer)
{
        int sock = -1;
        int iRet = -1;
        char sndbuf[1024];
        struct sockaddr_in sin;
        memset(sndbuf, 0x00, sizeof(sndbuf));



        sock = socket(AF_INET, SOCK_STREAM, 0);
        if( sock < 0 )
        {
                printf(" 打开通信描述字失败[%d, %s]\n", errno, strerror(errno) );
                return -1;
        }

        memset(&sin, 0x00, sizeof(struct sockaddr_in) );

        sin.sin_family                         = AF_INET;
        sin.sin_addr.s_addr                =inet_addr("192.16.9.111");
        sin.sin_port                        =htons (8879);

        iRet = connect(sock, (const struct sockaddr *)&sin, sizeof(sin) );
        if( iRet < 0 )
        {
                printf(" 连接192.16.9.111失败[%d, %s]\n", errno, strerror(errno) );
                return -1;
        }
        sprintf(sndbuf, "%s", buffer);
/*
        iRet = write(sock, sndbuf, strlen(sndbuf));
*/
        iRet = send(sock, sndbuf, strlen(sndbuf), 0);
        if( iRet != strlen(sndbuf) )
        {
                printf(" 发送111失败[%d, %s]\n", errno, strerror(errno) );
                return -1;
        }
        close(sock);
        return 0;

}

int main(int argc, char *argv[])
{
        int i = 0;
        char buf[1024];
        do
        {
                usleep(500000);
                memset(buf, 0x00, sizeof(buf));
                sprintf(buf, "%d,%s]", i, argv[1]);
                DealMsg( buf );        
                i++;
        }while( i < 1000 );
        return 0;

}

上面是我写的客户端代码,运行之后发现客户端所在的机器出现大量的TIME_WAIT连接,服务端没有。如何解决?
netstat -an|grep 8879
tcp4       0      0  192.16.9.228.55956     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55957     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55958     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55959     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55960     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55961     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55962     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55963     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55964     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55965     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55966     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55967     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55968     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55969     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55970     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55971     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55972     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55973     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55974     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55975     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55976     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55977     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55978     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55979     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55980     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55981     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55982     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55983     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55984     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55985     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55986     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55987     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55988     192.16.9.111.8879      TIME_WAIT
tcp4       0      0  192.16.9.228.55989     192.16.9.111.8879      TIME_WAIT

论坛徽章:
0
2 [报告]
发表于 2012-11-19 14:49 |只看该作者
TIME_WAIT是正常的。

论坛徽章:
0
3 [报告]
发表于 2012-11-19 15:15 |只看该作者
回复 2# mymtom_cu

   我的系统是个高并发的系统, 上面的代码只是我用来模拟我大并发。
当我把间隔时间设置成usleep(150000),最高出现100个TIME_WAIT,当设置成usleep(10000)基本就是 1000个TIME_WAIT。

论坛徽章:
0
4 [报告]
发表于 2012-11-20 11:10 |只看该作者
有两种方法:
1.创建socket后设置socket为可重用
2.或者在关闭socket时设置不可读写

论坛徽章:
0
5 [报告]
发表于 2012-11-20 13:05 |只看该作者
time_wait存在的理由:
1,可靠的实现tcp全双工连接的终止;
2,允许老的重复分解在网络中消逝;

你的例子中是默认的全双工关闭。
在全双工关闭的情况下,
1, client 主动调用close(), 发送FIN M给server; server read()返回0
2, server发送ACK M+1给client
3, server主动调用close(),发送FIN N给client; client返回ACK N+1给server

在2和3之间客户端是TIME_WAIT。你的例子中是客户端close后,服务端close之前,输出的time_wait错误。

解决:
1,服务端是否有及时close socket.
2,time_wait是正常的
3,你的客户端是连接,发送,断开;然后一直重复这个过程。期间和服务端只有一个连接,不是高并发。
可以先连接10000个,然后给所有这些连接循环发数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP