Chinaunix

标题: 出现了一些问题(tcp) [打印本页]

作者: stiandao    时间: 2006-06-20 11:22
标题: 出现了一些问题(tcp)
我用tcp在本机上进行发送接收,结果出现现列情况(netstat -ant),时间越长最多

请问这是什么原因,怎么解决呢???

tcp        0      0 192.168.8.106:1234      192.168.8.106:22848     ESTABLISHED
tcp       31      0 192.168.8.106:1234      192.168.8.106:22849     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:22828     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:22829     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:22831     ESTABLISHED
tcp        0      0 192.168.8.106:22831     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22829     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22828     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22827     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22847     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22846     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22844     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22843     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22842     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22841     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22839     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22838     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22837     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22834     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22833     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22832     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22852     192.168.8.106:1234      ESTABLISHED
tcp        0     31 192.168.8.106:22850     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22849     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:22848     192.168.8.106:1234      ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:22827     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:22837     ESTABLISHED
tcp        0      0 192.168.8.106:32919     192.168.8.106:1521      ESTABLISHED
作者: windflowers1976    时间: 2006-06-20 11:29
把情况说清楚一点。
猜测大概是因为你频繁的关闭TCP链接吧。
作者: stiandao    时间: 2006-06-20 11:33
代码如下:

server.c
  1. #include <stdio.h>
  2. #include <strings.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>

  8. #define PORT 1234
  9. #define BACKLOG 1

  10. int main(void)
  11. {
  12.         int listenfd,new_fd;
  13.         struct sockaddr_in server;
  14.         struct sockaddr_in client;
  15.         int sin_size;
  16.         fd_set fdset;

  17.         char hello[1024*5];
  18.         if( -1 == ( listenfd = socket( AF_INET, SOCK_STREAM, 0)))
  19.         {
  20.                 printf("Creating socket failed.\n");
  21.                 exit(1);
  22.     }
  23.    
  24.     bzero( &server,sizeof(server));
  25.     server.sin_family = AF_INET;

  26.     server.sin_port = htons(PORT);
  27.     server.sin_addr.s_addr = htonl( INADDR_ANY);
  28.    
  29.     if( -1 == bind( listenfd, ( struct sockaddr *)&server, sizeof( struct sockaddr)))
  30.     {
  31.             printf("Bind error.\n");
  32.             exit(1);
  33.     }
  34.    
  35.     if( -1 == listen( listenfd, BACKLOG))
  36.     {
  37.             printf("listen() error.\n");
  38.             exit(1);
  39.     }
  40.    
  41.     sin_size = sizeof( struct sockaddr_in);
  42.     while(1)
  43.     {

  44.    
  45.     if(-1 == ( new_fd = accept( listenfd, ( struct sockaddr *)&client, &sin_size)))
  46.     {
  47.             printf(" accept() error.\n");
  48.             exit(1);
  49.     }
  50.             memset(hello ,0,sizeof(hello));
  51.                 // 阻塞读
  52.                 if(read(new_fd,hello,1024*5)<0){
  53.                         close(new_fd);
  54.                         continue;
  55.                 }

  56.                 printf("len=%d,Recv=%s\n",strlen(hello),hello);
  57. }
  58.     close( new_fd);
  59.     close( listenfd);
  60. }
复制代码



client.c
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <strings.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <netdb.h>
  8. #define PORT 1234
  9. #define MAXDATASIZE 100


  10. int main( int argc, char* argv[])
  11. {
  12.    int iSocket, numbytes;
  13.    char buf[MAXDATASIZE];
  14.    struct hostent *he;
  15.    int  nWrite;
  16.    struct sockaddr_in server;
  17.    char bdf[1024*5];
  18.     int i,j;   
  19.     while(1)
  20.     {
  21.             i=0;
  22.                
  23.         memset(bdf,0x00,sizeof(bdf));
  24.     /* 启动一个tcp连接 */
  25.         if( -1 == (iSocket = socket( AF_INET, SOCK_STREAM, 0)))
  26.         {
  27.             printf(" socket() error.\n");
  28.             exit(1);
  29.         }
  30.         
  31.         
  32.         bzero( &server,sizeof( server));
  33.         server.sin_family = AF_INET;
  34.         server.sin_port = htons(PORT);
  35.         server.sin_addr.s_addr=inet_addr("192.168.8.106");
  36.         
  37.         if( -1 == connect( iSocket,( struct sockaddr*)&server,sizeof( struct sockaddr)))
  38.         {
  39.                 printf("connect() error.\n");
  40.                 exit(1);
  41.         }
  42.        for(j=0;j<=3;j++)
  43.         {
  44.                
  45.             memset(bdf,0x00,sizeof(bdf));
  46.             if(j==0)
  47.             {
  48.                 strcpy(bdf,"200220010");
  49.                 nWrite=write(iSocket,bdf,strlen(bdf));
  50.             }      
  51.             else if(j==1)
  52.             {
  53.                 strcpy(bdf,"3333333333");
  54.                 nWrite=write(iSocket,bdf,strlen(bdf));
  55.              }else if(j==2)
  56.              {
  57.                strcpy(bdf,"4444444444");
  58.                   nWrite=write(iSocket,bdf,strlen(bdf));
  59.              }
  60.              else if(j==3)
  61.              {
  62.                strcpy(bdf,"55");
  63.                   nWrite=write(iSocket,bdf,strlen(bdf));
  64.              }
  65.            
  66.          }
  67.       sleep(1);
  68.      }
  69.      close( iSocket);
  70. }
复制代码




各位看看吧???
作者: stiandao    时间: 2006-06-20 11:44
我把server.c中的
// 阻塞读
                if(read(new_fd,hello,1024*5)<0){
                        close(new_fd);
                        continue;
中的close(new_fd);去了,还是出现上述问题,请问是什么原因?????
作者: stiandao    时间: 2006-06-20 13:07
我自己顶,请问是什么原因,要不我的贴子就沉了
作者: linternt    时间: 2006-06-20 13:15
你看你的SEVER程序,accept一个连接以后,进行一次操作,下次有连接你还是再accept一次,每个都不关闭,当然会有很多你看到的东西,你试着在accept后建一个循环,一直到客户端断开连接后再跳出来,关闭SOCKET,继续监听。。。。。
作者: stiandao    时间: 2006-06-20 13:54
原帖由 linternt 于 2006-6-20 13:15 发表
你看你的SEVER程序,accept一个连接以后,进行一次操作,下次有连接你还是再accept一次,每个都不关闭,当然会有很多你看到的东西,你试着在accept后建一个循环,一直到客户端断开连接后再跳出来,关闭SOCKET,继 ...



我在accept,read后,关闭了new_fd

但是还是存在问题呀????
作者: stiandao    时间: 2006-06-20 14:09
这是新的代码:

server.c

  1. #define PORT 1234
  2. #define BACKLOG 64
  3. #define SIZENUM 1024*2
  4. int main(void)
  5. {
  6.         int listenfd;
  7.         struct sockaddr_in server;
  8.         struct sockaddr_in client;
  9.         int sin_size;
  10.         fd_set fdset;

  11.         char hello[1024];
  12.         if( -1 == ( listenfd = socket( AF_INET, SOCK_STREAM, 0)))
  13.         {
  14.                 printf("Creating socket failed.\n");
  15.                 exit(1);
  16.     }
  17.    
  18.     bzero( &server,sizeof(server));
  19.     server.sin_family = AF_INET;
  20.     server.sin_port = htons(PORT);
  21.      server.sin_addr.s_addr=inet_addr("192.168.8.106");
  22.     if( -1 == bind( listenfd, ( struct sockaddr *)&server, sizeof( struct sockaddr)))
  23.     {
  24.             printf("Bind error.\n");
  25.             exit(1);
  26.     }
  27.    
  28.     if( -1 == listen( listenfd, BACKLOG))
  29.     {
  30.             printf("listen() error.\n");
  31.             exit(1);
  32.     }
  33.    
  34.     sin_size = sizeof( struct sockaddr_in);
  35.     while(1)
  36.     {
  37.    
  38.   
  39.      int new_fd;
  40.     if(-1 == ( new_fd = accept( listenfd, ( struct sockaddr *)&client, &sin_size)))
  41.     {
  42.             printf(" accept() error.\n");
  43.             exit(1);
  44.     }
  45.             memset(hello ,0,sizeof(hello));
  46.        // 阻塞读
  47.        if(read(new_fd,hello,1024*5)<0){
  48.         printf(" read error.\n");
  49.         close(new_fd);
  50.         continue;
  51.       }

  52.      printf("len=%d,Recv=%s\n",strlen(hello),hello);
  53.      /* 关闭 */
  54.     close(new_fd);
  55. }

  56. }close( listenfd);
  57. }
复制代码




client.c
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <strings.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <netdb.h>
  8. #define PORT 1234
  9. #define MAXDATASIZE 100


  10. int main( int argc, char* argv[])
  11. {
  12.    int iSocket, numbytes;
  13.    char buf[MAXDATASIZE];
  14.    struct hostent *he;
  15.    int  nWrite;
  16.    struct sockaddr_in server;
  17.    char bdf[1024];
  18.     int i,j;   
  19.   
  20.             i=0;
  21.      while(1)
  22.     {         
  23.         memset(bdf,0x00,sizeof(bdf));
  24.        if( -1 == (iSocket = socket( AF_INET, SOCK_STREAM, 0)))
  25.         {
  26.             printf(" socket() error.\n");
  27.             exit(1);
  28.         }
  29.         
  30.         
  31.         bzero( &server,sizeof( server));
  32.         server.sin_family = AF_INET;
  33.         server.sin_port = htons(PORT);
  34.         server.sin_addr.s_addr=inet_addr("192.168.8.106");
  35.    
  36.         if( -1 == connect( iSocket,( struct sockaddr*)&server,sizeof( struct sockaddr)))
  37.         {
  38.                 printf("connect() error.\n");
  39.                 exit(1);
  40.         }
  41.         
  42.                 strcpy(bdf,"200220010");
  43.                 nWrite=write(iSocket,bdf,strlen(bdf));
  44.   
  45.         
  46.          close( iSocket);
  47.           sleep(2);
  48.    }
  49. }
复制代码



哪位帮我看看,

出现下面情况
tcp        0      0 192.168.8.106:1234      192.168.8.106:35078     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35079     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35072     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35073     TIME_WAIT   
tcp        0      0 192.168.8.106:32788     192.168.8.106:32774     ESTABLISHED
tcp      672      0 192.168.8.106:32784     192.168.8.106:32774     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:35074     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35075     TIME_WAIT   
tcp        0      0 127.0.0.1:35076         127.0.0.1:3566          TIME_WAIT   
tcp        0      0 127.0.0.1:35077         127.0.0.1:32769         TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35084     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35085     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35086     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35087     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35080     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35081     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35082     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35083     TIME_WAIT   
tcp        0      0 192.168.8.106:32774     192.168.8.106:32784     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:35092     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35093     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35094     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35095     TIME_WAIT   
tcp        0      0 192.168.8.106:32774     192.168.8.106:32788     ESTABLISHED
tcp        0      0 192.168.8.106:1234      192.168.8.106:35088     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35089     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35090     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35091     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35068     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35069     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35070     TIME_WAIT   
tcp        1      0 192.168.8.106:35097     192.168.8.106:1234      CLOSE_WAIT  
tcp        0      0 192.168.8.106:1234      192.168.8.106:35071     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35096     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35097     FIN_WAIT2   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35066     TIME_WAIT   
tcp        0      0 192.168.8.106:1234      192.168.8.106:35067     TIME_WAIT  


而且时间越长越多,请帮我看看???


d
作者: blogliou    时间: 2006-06-20 14:48
加linger,取消close延迟.
作者: stiandao    时间: 2006-06-20 14:51
原帖由 blogliou 于 2006-6-20 14:48 发表
加linger,取消close延迟.



linger是什么意思呀?
作者: gu_wh    时间: 2006-06-20 14:54
struct linger lg;
        lg.l_onoff=1;
        lg.l_linger=0;
作者: stiandao    时间: 2006-06-20 15:07
还是不行呀,
我在server.c中加了那个结构体,在client.c中去除了sleep(2)

但是还是不行
作者: gu_wh    时间: 2006-06-20 15:25
两边都要加的
作者: stiandao    时间: 2006-06-20 16:05
两边都加上了,但是还是不行,要不你试试
作者: czshjh    时间: 2006-06-20 16:17
在listen成功以后close( listenfd)就可以了,这时 listenfd已经没用了。
作者: stiandao    时间: 2006-06-20 16:21
原帖由 czshjh 于 2006-6-20 16:17 发表
在listen成功以后close( listenfd)就可以了,这时 listenfd已经没用了。


在listen成功以后close( listenfd),那还怎么监听呀,

而我的server中最后一行不就是close(listenfd)吗
作者: czshjh    时间: 2006-06-20 16:26
对不起,写错了,是在accept之后,不管accept成功与否都需要close( listenfd)
作者: stiandao    时间: 2006-06-20 16:30
原帖由 czshjh 于 2006-6-20 16:26 发表
对不起,写错了,是在accept之后,不管accept成功与否都需要close( listenfd)



accept后面对还是错我己经加上了close了
作者: czshjh    时间: 2006-06-20 17:02
仔细看一下你的程序,你的程序中,无论何种情况,都不会走到close( new_fd)和close( listenfd)的
作者: stiandao    时间: 2006-06-20 17:30
原帖由 czshjh 于 2006-6-20 17:02 发表
仔细看一下你的程序,你的程序中,无论何种情况,都不会走到close( new_fd)和close( listenfd)的

这是server.c

  while(1)
    {
   
  
     int new_fd;
    if(-1 == ( new_fd = accept( listenfd, ( struct sockaddr *)&client, &sin_size)))
    {
            printf(" accept() error.\n");
            exit(1);
    }
            memset(hello ,0,sizeof(hello));
       // 阻塞读
       if(read(new_fd,hello,1024*5)<0){
        printf(" read error.\n");
        close(new_fd);
        continue;
      }

     printf("len=%d,Recv=%s\n",strlen(hello),hello);
     /* 关闭 */
    close(new_fd);                     *************************这能走到 了呀*****
}

上面的
close(new_fd);  可以走到                  
也就是每个连接都 close(new_fd);了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2