Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2009, 00:52   #1
marain
Новичок
Джуниор
 
Регистрация: 07.01.2009
Сообщений: 1
По умолчанию Программный шлюз не хочет читать

Доброго всем времени суток. Написал своеобразный шлюз: он принимает запросы клиента, создает новый поток и прокидывает клиента дальше по сети (т.е. обычный пересыльщик). Чтобы не болтаться просто так в бесконечном цикле использую события с метками FD_ACCEPT, FD_READ и т.д. Когда гонял через шлюз лично написанный клиент-сервер, все события отрабатывали нормально: данные пришли, шлюз пробудился, переслал. Проблема возникла, когда возникла необходимость зацепиться за шлюз через браузер и выйти на какой-нибудь сайт (Яндекс, например). Шлюз упорно не воспринимает данные на чтение и подвисает. Привожу код потокового обработчика клиентских запросов (функции чтения и записи - собственные). Заранее признателен за найденые косяки. Очень-очень нужно, чтобы все работало, а то меня порвут

Код:
DWORD WINAPI MainThread(LPVOID lpParam){

int res;
int i;
WSAEVENT *hEvents = NULL;
DWORD dwIndex;
CONNECTION *conn = (CONNECTION *)lpParam;
hEvents = (WSAEVENT *)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, sizeof(WSAEVENT)*2);
if(hEvents == NULL){
event_printf("GlobalAlloc failed: %s\r\n", (const char *)sys_sockGetLastError()); 
return 1;
}

for(i = 0;i < 2;i ++){
hEvents[i] = WSACreateEvent();
if(hEvents[i] == NULL){
event_printf("WSACreateEvent failed: %s\r\n", (const char *)sys_sockGetLastError()); 
return 1;
}
}
if((WSAEventSelect(conn->in_sock, hEvents[0], FD_READ|FD_WRITE|FD_CLOSE) == SOCKET_ERROR)||(WSAEventSelect(conn->out_sock, hEvents[1], FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE) == SOCKET_ERROR)){
event_printf("WSAEventSelect failed: %s\r\n", (const char *)sys_sockGetLastError()); 
return 1;
}
i = 0;

while(1) {
printf("%i\n",i); 
dwIndex = WSAWaitForMultipleEvents(2, hEvents, FALSE, [/SIZE]/*WSA_INFINITE*/10000, FALSE[SIZE=2]);
if(dwIndex == WSA_WAIT_FAILED){
event_printf("WSAEventSelect failed: %s\r\n", (const char *)sys_sockGetLastError()); 
return 1;
}
dwIndex -= WSA_WAIT_EVENT_0;
if(dwIndex == 0){
printf("+++%i+++\n", conn->in_sock);
if(conn->status==CONNECTED && !conn->suspended)
perform_read(conn, conn->in_sock, &conn->out_buf, &conn->out_buf_len);
if(conn->status==CONNECTED && !conn->suspended)
perform_write(conn, conn->out_sock, &conn->out_buf, &conn->out_buf_len); 
}
else{
printf("---%i---\n", conn->out_sock);
if(conn->status==CONNECTED && !conn->suspended)
perform_read(conn, conn->out_sock, &conn->in_buf, &conn->in_buf_len);
if(conn->status==CONNECTED && !conn->suspended)
perform_write(conn, conn->in_sock, &conn->in_buf, &conn->in_buf_len); 
if(conn->status==CONNECTING) perform_connect(conn);
}
if(conn->status==CLOSING && 
(!conn->in_buf_len && !conn->out_buf_len || 
(time(NULL)-conn->stop)>=linger) ){
close_connection(conn);
break;
}
WSAResetEvent(hEvents[dwIndex]);
i++;
}
for(i = 0;i < 2;i ++){
WSACloseEvent(hEvents[i]);
}
GlobalFree(hEvents);
return 0;
}

Без событий все отрабатывает ок(просто в цикле вызывая те же функции).
Модератор: тег CODE

Последний раз редактировалось MaTBeu; 07.01.2009 в 17:40.
marain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программный доступ к папке System Volume Information gogy2 Общие вопросы Delphi 0 22.11.2008 23:25
Программный клик мышью Аlex Win Api 1 30.06.2008 23:30
DVD-RW дисковод не хочет читать некоторые диски ERASERROR Компьютерное железо 10 02.05.2008 01:00
GSM - шлюз snake-as Свободное общение 3 01.04.2008 14:50