我使用socket api写了一个server/client异步程序,在client端 用NETSTAT命令检查出现了很多TIMEWAIT ,谁能给我讲讲是什么意思.我初次接触网络编程,请大家指点一下应该注意的事情,和调试方法

解决方案 »

  1.   

    买一本《TCP/IP详解》的第一卷,上面说得很详细。TIMEWAIT是关闭套接口的几步中的一步。
    TCP连接的建立和删除都是有一定步骤规范的,如通常所说的三握手协议。
      

  2.   

    初学网络编程,
    不要搞那么复杂,
    先用一些封装好的类。
    像CAsyncSocket,CSocket这样的,
    用起来比较简单,
    熟悉了以后,再慢慢像底层过渡。
    不要一开始就研究TCP/IP
    《TCP/IP祥解〉太深。
      

  3.   

    SOCKET CreateServerSocket()
    {
    SOCKET server = socket(AF_INET, SOCK_STREAM, 0); if(server == INVALID_SOCKET)
    {
    CString err;
    err.Format("Error %d", WSAGetLastError());
    AfxMessageBox(err); return server;
    } sockaddr sock_addr;
    sockaddr_in *addr_in = (sockaddr_in *)(&sock_addr); memset(addr_in, 0, sizeof(sockaddr_in));
    addr_in->sin_family = AF_INET;
    //addr_in->sin_port = htons(7999);
    addr_in->sin_port = htons(8000);
    // addr_in->sin_addr = 0;
    int b = bind(server, &sock_addr, sizeof(sockaddr));
    if(b!=0)
    {
    CString err;
    err.Format("Error %d", WSAGetLastError());
    AfxMessageBox(err);
    closesocket(server);
    return INVALID_SOCKET;
    }
    return server;}#include "iostream.h"
    int ThreadFunc(void *p)
    {
    SOCKET server = CreateServerSocket();
    if(server == INVALID_SOCKET)
    return -1;
    else
    cout << "Socket Listening... " << endl;
    int  i = listen(server, 15); if(i!=0)
    {
    CString err;
    err.Format("Error %d", WSAGetLastError());
    AfxMessageBox(err);
    closesocket(server);
    return -2;
    }

    fd_set fdread;
    fd_set fdwrite;
    fd_set fdexcept; fd_set currentset; FD_ZERO(&fdread);
    FD_ZERO(&fdwrite);
    FD_ZERO(&fdexcept);
    FD_ZERO(&currentset); FD_SET(server, &fdread); int count = 0;
    while(1)
    {
    sockaddr addrr;
    int len = sizeof(sockaddr);
    FD_ZERO(&fdread); FD_ZERO(&fdwrite);FD_ZERO(&fdexcept); FD_SET(server, &fdread);
    FD_SET(server, &fdexcept); memcpy(&(fdread.fd_array[1]), currentset.fd_array,currentset.fd_count *4);
    memcpy(fdwrite.fd_array, currentset.fd_array,currentset.fd_count *4);
    memcpy(&(fdexcept.fd_array[1]), currentset.fd_array ,currentset.fd_count*4);
    fdread.fd_count += currentset.fd_count ;
    fdexcept.fd_count += currentset.fd_count;
    fdwrite.fd_count = currentset.fd_count ;
    int i = select(0, &fdread, &fdwrite, &fdexcept, NULL); if(i == SOCKET_ERROR)
    {
    CString err;
    err.Format("Select Error %d", WSAGetLastError());
    cout << err.GetBuffer(err.GetLength()) << endl;//TRACE("err");
    continue;
    }
    int k; for(k = 0; k < fdread.fd_count ;k++)
    {
    if(server == fdread.fd_array[k])
    {
    sockaddr addrr;
    SOCKET client = accept(server, &addrr, &len);
    if(client != INVALID_SOCKET)
    {
    FD_SET(client, &currentset);
    }
    else
    cout << "!!error accept" << WSAGetLastError() << endl;
    }
    else
    {
    char buf[301] = "";
    int cl;
    while((cl = recv(fdread.fd_array[k], buf,sizeof(buf),0))>0)
    {
    cout << "cl = " << cl << " buf = " << count ++  << buf << endl;

    }
    if(cl == 0)
    {
    closesocket(fdread.fd_array[k]);
    FD_CLR(fdread.fd_array[k], &currentset);
    }
    else if(cl <0)
    {
    int err = WSAGetLastError();
    if(err!=WSAEWOULDBLOCK)
    {

    FD_CLR(fdread.fd_array[k],&currentset);
    closesocket(fdread.fd_array[k]);
    }
    }
    }
    }
    for(k = 0; k < fdexcept.fd_count ;k++)
    {
    cout << "in except -------------------" << k << "       " << fdexcept.fd_count << endl;
    closesocket(fdexcept.fd_array[k]);
    FD_CLR(fdexcept.fd_array[k], &currentset);
    }
    }}
    SOCKET CreateClientSocket()
    {
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == INVALID_SOCKET)
    {
    // CString err;
    // err.Format("Client Error %d", WSAGetLastError());
    // AfxMessageBox(err);
    return sock;
    } sockaddr sock_addr;
    sockaddr_in *addr_in = (sockaddr_in *)(&sock_addr);
    addr_in->sin_family = AF_INET;
    UINT ii = inet_addr("xxx.xxx.xxx.xxx");
    memcpy(&addr_in->sin_addr ,&ii, 4);
    addr_in->sin_port = htons(8000); if(connect(sock, &sock_addr, sizeof(sockaddr))!=0)
    {
    CString err;
    err.Format("Connect Error %d" , WSAGetLastError());
    AfxMessageBox(err);
    return INVALID_SOCKET;
    }
    return sock;

    }///这里是客户程序
    UINT clientcontrol(LPVOID param)
    {
    int iThread = (int)param;
    // iThread++;
    UINT k = 0;
    UINT j = 0;
    clock_t start = clock();

    while(k<5000)
    {
    k++;
    SOCKET sock = CreateClientSocket(); if(sock == INVALID_SOCKET)
    return 0; char buf[300] = "";
    //sprintf(buf, "Thread %d  loop %d  successed %d", (int)param, k, j); memcpy(buf,&iThread,4);
    memcpy(&buf[4],&k,4);
    int r = send(sock, buf, sizeof(buf), 0);
    if(r==SOCKET_ERROR)
    {
    closesocket(sock);
    continue;
    }
    j++;
    closesocket(sock);
    }
    clock_t end = clock();
    CString err;
    err.Format("Thread %d Treminated, loop = %d, success = %d, time start = %d, time end = %d", iThread, k, j, start, end);
    AfxMessageBox(err);
    return 0;
    }int ThreadCount = 0;
    void CClientDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    for(int i=0;i<40;i++)
    {
    ThreadCount++;
    AfxBeginThread( clientcontrol, (void *)ThreadCount, 2);
    }
    }
      

  4.   

    ezway(高手的零头★★★★☆) 多多指教啊
      

  5.   

    我主要想知道TIMEWAIT如果累计了非常多的话在应用中有什么影响
      

  6.   

    TIMEWAIT是tcp在关闭过程中的正常状态,没有影响。
    看看<tcp/ip详解 卷I:协议> w.Richard Stevens 就明白了。
      

  7.   

    to XUYING(),ezway
    很想和两位交个朋友,好请两位经常指教
    如果愿意给我来个信
    [email protected]