У меня есть прокси-приложение, которое прослушивает подключения из браузера на порт 4711. Затем приложение отправляет запросы на сервер (собственное приложение) и сравнивает версию запрошенных данных сервера с локальным кешем, а затем применяет эту разницу и отправляет данные обратно в браузер.Проблема с сетевым приложением с использованием некоторых браузеров
Я работаю с очень просто сайтами, которые содержат только домашнюю страницу. Но работает корректно только в IE 10. Я тестировал FF, Chrome, Safari, но они не работают. Они висят во время запросов к прокси.
Приложение написано на C, используя SDL и сетевые функции SDL_Net. Используются неблокирующие сокеты 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)
}
Я также могу добавить, что приложение не отправляет даже нужные пакеты в браузер. Для этой цели я использовал Softiffer Softfer.
Вы должны предоставить информацию, фильма в частности коды, ожидаемые результаты и фактические результаты. –
Вы запускаете сетевой сниффер и проверяете, отправляет ли приложение ответы. Если это не так, вы запускаете приложение с помощью отладчика и проверяете, где происходят неожиданные события, которые мешают ему отправлять ответы. Если он отправляет ответы, но ваши браузеры просто их не видят, вы можете либо обвинить брандмауэр, либо винить неправильную реализацию HTTP-протокола вашим приложением, либо винить неправильную реализацию HTML вашим приложением. –
Спасибо за комментарии. Я отключил все брандмауэры на своем ПК, в том числе брандмауэр Windows, и у меня такая же проблема. Я думаю, что проблема в коде. Как вы думаете, может быть разница в протоколах в разных браузерах, потому что IE работает все еще? – vns955