使用某些浏览器的网络应用问题

时间:2014-12-29 14:24:43

标签: c sockets network-programming sdl sdl-net

我有简单的代理应用程序,它在端口4711上侦听来自浏览器的连接。然后,应用程序向服务器(自己的应用程序)发送请求,并将服务器的请求数据版本与本地缓存进行比较,然后应用该差异并发送数据回到浏览器。

我工作到非常简单的网站,内容只有主页。但是只有在IE 10中才能正常工作。我测试了FF,Chrome,Safari,但它们无法正常工作。他们在代理请求时挂起。

应用程序使用SDL和SDL_Net网络功能在C上编写。使用非阻塞TCP套接字。我正在使用VS 2010和Windows 8进行调试。

请建议我应该先检查一下。我理解我非常简短地描述了这个问题,但如果需要,我可以提供额外的信息(代码片段等)。

确定。在这里放一些代码。

typedef struct _UA_REQUEST
{
    My_string   full_url ;
    uint32_t        url_adler32 ;
    TCPsocket   sock_ua ;
    uint32_t    status_flag ;               // ref Enum STATUS
} UA_REQUEST ;

UA_REQUEST  GLB_ARRAY__UA_REQ[ NUM_UA_SOCK ] ;
TCPsocket   GLB_SOCK_SS={0} , GLB_LSOCK_UA={0} ;


        while( 1 )
        {
            nrdy = SDLNet_CheckSockets(GLB_SOCK_SET, -1 /*1000*/);
            if(nrdy == -1 )
                break ;
            if( !nrdy )
                continue ;

            check_listener_socket() ;
            check_user_agent_sockets() ;
            check_single_stream_socket() ;
        }

    //==================================================================
    //  Check and handle connection request from UA ( user agent )
    //==================================================================

    void check_listener_socket()
    {
        uint32_t index ;
        UA_REQUEST*ar = GLB_ARRAY__UA_REQ ;
        if( !SDLNet_SocketReady( GLB_LSOCK_UA ) )
        {
            puts("check_listener_socket():  GLB_LSOCK_UA is not ready!");
            return ;
        }

        TCPsocket sock_ua = SDLNet_TCP_Accept( GLB_LSOCK_UA ) ; // accept connection from browser

        if( !sock_ua)
        {
            printf("ERR__TCP_Accept: %s\n", SDLNet_GetError());
            goto quit ;
        } else
            printf("Accepted.\n");

        for( index=0 ; (index < NUM_UA_SOCK) ; index++)
            if( STATUS(ar,index) == ST_SOCK_CLOSED )
                break ;
        if( index >= NUM_UA_SOCK )
            return;

        SOCK_UA( ar , index ) = sock_ua;
        STATUS( ar , index )    = ST_SOCK_AVLBL ;
        SDLNet_TCP_AddSocket( GLB_SOCK_SET , SOCK_UA( ar, index ) ) ;

    quit:
        return;
   }

//==================================================================
//  Check and receive data from UA
//==================================================================

void check_user_agent_sockets()
{
    UA_REQUEST *ar = GLB_ARRAY__UA_REQ ;
    uint32_t index ;

    for( index=0 ;  index < NUM_UA_SOCK ; index++)  
    {
        int ready = SDLNet_SocketReady( SOCK_UA(ar,index) );
        if( /*STATUS( ar,index) != ST_SOCK_CLOSED &&*/
            ready /*SDLNet_SocketReady( SOCK_UA(ar,index) ) */
        )
        {
            printf("index =  %i\n", index);
            handle_ua_sock_ready( index ) ;
        }
    }
}

void handle_ua_sock_ready( uint32_t i )
{
    My_string _req_mstr ;
    MY_ALLOC( _req_mstr , MAXLEN )

    byte*request    = _req_mstr.c_str ;
    byte*pcrlf  = NULL ;
    RESET_BUF(request)

    UA_REQUEST*ar = GLB_ARRAY__UA_REQ ;

    //uint32_t 
    int nrcv;   // : Slava
    nrcv = SDLNet_TCP_Recv( SOCK_UA(ar,i) , request , MAXLEN ) ;


    if( nrcv<=0 )
    {
        puts("handle_ua_sock_ready()  before handle_ua_sock_closed");
        handle_ua_sock_closed( ar , i ) ;
        puts("handle_ua_sock_ready()  after handle_ua_sock_closed");
        goto quit;
    }

    puts("1") ;
    if(                     
        ( STATUS(ar,i) == ST_TUNNEL)        
        || (MATCH( request , CONN , strlen(CONN)))  
    )                       
    {                       
        FULL_URL( ar , i ).c_str[0] = 0 ;       
        FULL_URL( ar , i ).len  = 0 ;       
        STATUS( ar , i )        = ST_TUNNEL ;   
        request[nrcv]   = 0 ;           

        send_to_server(TUNNEL_REQ ,request, nrcv, i);   
        goto quit;
    }   
    puts("11") ;
    if( get_hdrs_and_full_url(request, i ,(uint32_t*)&nrcv,pcrlf) == -1 )
    {
        puts("handle_ua_sock_ready()    test 2");
        goto quit ;
    }

    My_string *purl_mstr = &FULL_URL( ar , i ) ;

    log_msg( purl_mstr->c_str , purl_mstr->len , __LINE__ ) ;

    URL_ADLER32( ar, i) = my_adler_32( 1 , purl_mstr->c_str , purl_mstr->len ) ;



            fwrite( FULL_URL(ar,i).c_str , sizeof(byte), FULL_URL(ar,i).len , GLB_REQ_LOG) ;

    puts("111") ;


    CHECK_AND_HANDLE_GET_HEAD_REQ( i , request , nrcv )
    CHECK_AND_HANDLE_UNSUPPORTED(ar,i,request )
    uint32_t uv = nrcv;
    CHECK_AND_HANDLE_POST_OPT_REQ(ar,i,request ,/*nrcv*/ uv)
quit:
    MY_FREE( _req_mstr )
    return ;
}

//==================================================================
//  Check and receive reply from "Server"
//==================================================================

void check_single_stream_socket()
{
    puts("-- before return");
    if( !SDLNet_SocketReady(GLB_SOCK_SS) )
    {

        return ;    

    }
    puts("-- before receive_data_from_server()");
    receive_data_from_server() ;
}

//==================================================================
//
//  receive_data_from_server/0 :: First 4 bytes of "Payload" are eql to length of rest of Payload
// 
//==================================================================

void receive_data_from_server()
{
    My_string payload ;

    MY_ALLOC( payload , MAXLEN )

    int ncnt;   // : Slava
    uint32_t  nreply , req_index , rep_index ;
    uint32_t aallocated, ffreed ;


    byte err[100] ;
    bool bExitFlag = false;

    puts("30001") ;

    payload.len = 0 ;
    if( get_payload(&payload) == -1 )
        goto quit ;
    UA_REQUEST*req_arr  = GLB_ARRAY__UA_REQ ;
    SS_REPLY*rep_arr        = GLB_ARRAY__SS_REPLY ;

    puts("30002") ;

//  printf( "rep_type :: %u \nreq_id :: %u \n" , payload.c_str[0] , SDLNet_Read32( payload.c_str+1 ) ) ;

    uint8_t rep_type = payload.c_str[0] ;

    if( (rep_type == 1)
        || (rep_type == 3)
        || ( rep_type==4 )
    )                   /*ie req_id == req_arr index*/
    {
        puts("30003") ;

        req_index = SDLNet_Read32( payload.c_str+1 ) ;
        nreply  = payload.len-5 ;
        ncnt    = SDLNet_TCP_Send(
                        SOCK_UA( req_arr,req_index)
                        , payload.c_str+5 , nreply
                    ) ;
        if(ncnt < nreply)
        {
            sprintf((char*)err , "ERR__SOCK_WRITE :: bytes to be written: %u ;; actual num:: %u" , nreply , ncnt ) ;
            log_msg(err , strlen((char*)err) , __LINE__ ) ;
            handle_ua_sock_closed( req_arr , req_index ) ;
        }
    }
    else if( payload.c_str[0] == 2 )        /* < req_id == "url_adler32" > */
    {
        puts("30004") ;

        uint32_t url_adler32    = SDLNet_Read32( payload.c_str+1 ) ;

        for( req_index = 0 ; req_index<NUM_UA_SOCK ; req_index++ )
        {
            if(URL_ADLER32( req_arr , req_index) == url_adler32 )
            {

                puts("30005") ;

                My_string reply_mstr ;
                MY_ALLOC( reply_mstr , MAXLEN ) 
                update_cache__and__read_in_mystr(   payload.c_str+5 ,payload.len-5
                                ,&reply_mstr ,req_index
                                ) ;
                nreply = reply_mstr.len ;

                puts("30006") ;

                ncnt = SDLNet_TCP_Send(
                            SOCK_UA( req_arr , req_index)
                            , reply_mstr.c_str              // reply_mstr
                            , nreply
                        ) ;
                if(ncnt < nreply)
                {
                    sprintf((char*)err , "ERR__SOCK_WRITE :: bytes to be written: %u ;; actual num:: %u" , nreply , ncnt ) ;
                    log_msg(err , strlen((char*)err) , __LINE__ ) ;
                    handle_ua_sock_closed( req_arr , req_index ) ;
                }
                else
                    reset_req_arr_element( req_index) ;

                MY_FREE( reply_mstr )
                bExitFlag = true;   // : Slava
                break;
            }
        }


        if (!bExitFlag) 
        {
            for( rep_index = 0 ; rep_index<NUM_SS_REPLY ; rep_index++)
                if(STATUS( rep_arr , rep_index )==ST_EMPTY)
                    break ;
            My_string*pdel_mstr = &(REPLY( rep_arr , rep_index )) ;
            if(pdel_mstr->len)
                pdel_mstr->len = 0 ;
            append( pdel_mstr , payload.c_str+5 , payload.len-5 ) ;

            puts("30007") ;

            STATUS( rep_arr , rep_index ) = ST_OCCUPIED ;
        }

    }   /*</ id_type != "socket"> */
quit:
    MY_FREE( payload )
}

我还可以添加应用程序甚至不需要将数据包发送到浏览器。我使用SoftPerfect嗅探器实现这一目标。

1 个答案:

答案 0 :(得分:0)

感谢您的回答,特别是@n.m ..我使用Fiddler和SoftPerfect嗅探器来发现我的错误。我的代码中有错误。

谢谢大家, 维亚切斯拉