回 帖 发 新 帖 刷新版面

主题:请教下,为什么我发送了Http请求,服务端没回应呢?

我最近写代理服务器类似的程序,但是我将客户机给我的包处理后,发送到服务器确没有得到客户机的相应,一会儿就会显示"The remote server has closed."

不知道五一还有高手在线帮我看看不?

唉,最近老师崔着要在五一后必须把毕业设计搞定,五一也不能玩了,郁闷中...

部分代码:
... ...
typedef struct CombineSock{
    SOCKET sClient;//socket communicate with client.
    SOCKET sServer;
    SOCKADDR_IN addrClient;//client address.
    SOCKADDR_IN addrServer;
    BOOL bIsClientClosed;//if the client closed.
    BOOL bIsServerClosed;
}COMBINESOCK,FAR *PCOMBINESOCK;

typedef struct Package{
    COMBINESOCK csCom;
    char szInfo[DEFAULT_BUFFER_SIZE];//the data buffer.
}PACKAGE,FAR *PPACKAGE;
... ...

sCom[i].sClient=accept(g_sListen,(SOCKADDR*)&sCom[i].addrClient,&iAddrSize);

if(sCom[i].sClient==INVALID_SOCKET)
{
    printf("Accept connection failed with error:\n");
    WSAGetErrorToInfo();
    break;
}

//get the client name,and display status information.
... ...

//create a thread to handle the request.
hRecv=CreateThread(NULL,0,RecvClient,(PVOID)&sCom[i],0,NULL);

DWORD WINAPI RecvClient(LPVOID lpParam)
{
    PACKAGE ComPack;

    ... ..

    ComPack.csCom=*((COMBINESOCK*)lpParam);
    memset(ComPack.szInfo,0,DEFAULT_BUFFER_SIZE);

    ... ...

    while(TRUE)//always accept the client request until encountered errors,
        //or client closed connection.
    {
        retRecvC=recv(ComPack.csCom.sClient,ComPack.szInfo,DEFAULT_BUFFER_SIZE,0);
        if(retRecvC==0)//the client closed the connection gracefully.
        {
            printf("Client %s closed the connection.\n",
                szClientName);
            ComPack.csCom.bIsClientClosed=TRUE;
            break;
        }
        else if(retRecvC==SOCKET_ERROR)//encountered errors.
        {
            printf("Receive form %s failed with error:\n",
                szClientName);WSAGetErrorToInfo();
            ComPack.csCom.bIsClientClosed=TRUE;
            break;
        }
        ComPack.szInfo[retRecvC]='\0';
        #ifdef _DEBUG
        printf("Received %s:\n%s\n",szClientName,ComPack.szInfo);
        #endif

        GetAddrAndPort(ComPack.szInfo,szAddrReq,
            &ComPack.csCom.addrServer.sin_port);
                   ... ...

        if(!GetAddr(szAddrReq,&ComPack.csCom.addrServer.sin_addr.s_addr))
        {
            printf("The server %s requested by client %s can't reach.\n",
                szAddrReq,szClientName);
            //send the error message to the client.
            ... ...
            break;
        }
        
        HANDLE hSendToServer;
        //create thread to fetch the request from remote server.
        hSendToServer=CreateThread(NULL,0,ProxyToServer,(LPVOID)&ComPack,
            0,NULL);
        ... ...
    }
    closesocket(ComPack.csCom.sClient);
    return 1;
}

回复列表 (共2个回复)

沙发

DWORD WINAPI ProxyToServer(LPVOID lpParam)
{
    ... ...
    PACKAGE ComPack=*((PACKAGE*)lpParam);

    if(ComPack.csCom.bIsClientClosed)//has the client closed?
        return 1;
    //create socket to communicate with remote server.
    ComPack.csCom.addrServer.sin_family=AF_INET;
    ComPack.csCom.sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(ComPack.csCom.sServer==INVALID_SOCKET)
    {
        printf("Create socket to remote server failed with error:\n");
        WSAGetErrorToInfo();
        return 1;
    }
    //connect the remote server.
    if(connect(ComPack.csCom.sServer,
        (SOCKADDR*)&ComPack.csCom.addrServer,
        sizeof(ComPack.csCom.addrServer))==SOCKET_ERROR)
    {
        printf("Can not connect the server with error:\n");
        WSAGetErrorToInfo();
        ComPack.csCom.bIsServerClosed=TRUE;
        closesocket(ComPack.csCom.sServer);
        return 1;
    }
    printf("Connect remote server successfull.\n");
    //send the client request.
    nleft=strlen(ComPack.szInfo);
    while(nleft>0)//because of stream protocol.
    {
        ret=send(ComPack.csCom.sServer,&ComPack.szInfo[idx],nleft,0);
        if(ret==0)
        {
            printf("The remote server has closed.\n");
            ComPack.csCom.bIsServerClosed=TRUE;
            closesocket(ComPack.csCom.sServer);
            return 1;
        }
        else if(ret==SOCKET_ERROR)
        {
            printf("Send request to remote server failed with error:\n");
            ComPack.csCom.bIsServerClosed=TRUE;
            closesocket(ComPack.csCom.sServer);
            return 1;
        }
        nleft-=ret;
        idx+=ret;
    }
    printf("Send request to remote server successfull.\n");//[color=FF0000]程序可执行到此处[/color]    
    memset(ComPack.szInfo,0,DEFAULT_BUFFER_SIZE);
    //receive the response of the remote server.//[color=FF0000]不能接受到远程服务器的响应。[/color]
 ret=recv(ComPack.csCom.sServer,ComPack.szInfo,DEFAULT_BUFFER_SIZE,0);
    if(ret==0)
    {
        printf("The remote server has closed.\n");
        ComPack.csCom.bIsServerClosed=TRUE;
        closesocket(ComPack.csCom.sServer);
        return 1;
    }
    else if(ret==SOCKET_ERROR)
    {
        printf("Recieve from remote server failed with error:\n");
        WSAGetErrorToInfo();
        ComPack.csCom.bIsServerClosed=TRUE;
        closesocket(ComPack.csCom.sServer);
        return 1;
    }
    ComPack.szInfo[ret]='\0';
#ifdef _DEBUG
    printf("received the response of the remote server:\n%s\n",
        ComPack.szInfo);
#endif
    SendToClient(ComPack);
    return 0;
}

板凳

高手帮帮忙啊

我来回复

您尚未登录,请登录后再回复。点此登录或注册