多线程HTTP服务器套接字与CLOSE_WAIT挂起

时间:2017-04-28 14:23:50

标签: c++ multithreading sockets

我有一个C ++服务器应用程序。服务器应用程序充当HTTP 这种情况下的服务器。随着大量请求socket移动到 CLOSE_WAIT state.With少数请求工作正常。

void *task1(void *);
static int connFd;
int noThread = 0;


int main()
{
    int pId, portNo, listenFd;

    socklen_t len; //store size of the address
    bool loop = false;
    struct sockaddr_in svrAdd, clntAdd;
    pthread_t threadA[500];
    portNo = 9898 ;
    cout<<"td::string::npos = "<<std::string::npos<<endl;
    if((portNo > 65535) || (portNo < 2000))
    {
        cout<<"Please enter a port number between 2000 - 65535";
        return 0;
    }
    //create socket
    listenFd = socket(AF_INET, SOCK_STREAM, 0);
    if(listenFd < 0)
    {
        cout<< "Cannot open socket"<<endl;
        return 0;
    }

    bzero((char*) &svrAdd, sizeof(svrAdd));
    svrAdd.sin_family = AF_INET;
    svrAdd.sin_addr.s_addr = INADDR_ANY;
    svrAdd.sin_port = htons(portNo);

    //bind socket
    if(bind(listenFd, (struct sockaddr *)&svrAdd, sizeof(svrAdd)) < 0)
    {
        cout<<"Cannot bind"<<endl;;
        return 0;
    }

    listen(listenFd, 5);

    len = sizeof(clntAdd);



    while (noThread < 500)
    {
        cout<<"Listening"<<endl;

        //this is where client connects. svr will hang in this mode until client conn
        connFd = accept(listenFd, (struct sockaddr *)&clntAdd, &len);

        if (connFd < 0)
        {
            cout<<"Cannot accept connection"<<endl;
            return 0;
        }
        else
        {
            cout<<"Connection successful" <<endl;
        }

        //pthread_create(&threadA[noThread], NULL, test::task1, NULL);
        //thr_create(&threadA[noThread], NULL, task1, NULL);
        pthread_create(&threadA[noThread], NULL, task1, NULL);


        noThread++;
        cout<<"Number of noThread :"<< noThread;
    }

    for(int i = 0; i < 500; i++)
    {
        pthread_join(threadA[i], NULL);
        //thr_join(threadA[i], NULL);
        cout<<"inside join"<<i;
    }



}

void *task1 (void *dummyPt)
{
    cout<<"Thread No: " << pthread_self();
    char test[1000];
    bzero(test, 1001);
    bool loop = false;
    int t=0;
    while(t==0)
    {
        bzero(test, 1001);


        read(connFd, test, 1001);
       string t1(test);


          if(tester.find("connection_request")!=std::string::npos){
                if(connFd)
                 {
                   cout<<"T1 :"<<t1<<endl;
                   send(connFd, "HTTP/1.0 200 OK\n\n", 17, 0);

                   write(connFd,"Test Response",13);

                  }
                else
                  cout << "Problem With collection FD";
                 t=1;
             }

    }
    cout<<"Closing thread and conn"<<endl;
    close(connFd);
    noThread--;
    return NULL;
}

0 个答案:

没有答案
相关问题