bitset Опубликовано 19 марта, 2007 Жалоба Поделиться Опубликовано 19 марта, 2007 Кто нибудь сталкивался с нижеследующими ошибками. Приведен код, элементарный, почти целиком взят из примеров. Обнаружились следующие странные ошибки: 1) При приеме первого подключения сервером IP адрес клиента = 0.0.0.0 в структуре caddr, со второго подключения уже ставятся правильные IP в структуре caddr. 2) Тестировал прогу в ASPLinux. В Debian же появляется дополнительный баг. Сервак подключение принимает, но при попытке чтения из сокета csocket, recv возвращает 0. Не всегда, но примерно в 40% подключений. Непонятно то, что код является простейшим и в то же время такие баги. Причину найти так и не могу. Если есть у кого нибудь соображения поделитесь плиз. int main() { // отключаем программу от консоли daemon(1,0); int lsocket, csocket; if ((lsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) failed("lsocket create failed. exit"); sockaddr_in laddr, caddr; int caddr_size = 0; memset(&laddr, 0, sizeof(laddr)); memset(&caddr, 0, sizeof(caddr)); laddr.sin_family = AF_INET; laddr.sin_port = htons(WZ_SERV_LISTPORT); laddr.sin_addr.s_addr = INADDR_ANY; if (bind(lsocket,(struct sockaddr*) &laddr, sizeof(laddr))) failed("bind failed. exit"); if (listen(lsocket, WZ_SERV_MAX_CONNECTIONS)) failed("listen failed. exit"); // принимаем подключения while(bIsRunFlag) { dbgmsg("wait for connection..."); // если потоков больше максимального, то ждем while(iAmountThreads > WZ_SERV_MAX_THREADS) sleep(1); csocket = accept(lsocket, (struct sockaddr *) &caddr, (socklen_t*) &caddr_size); if(csocket<=0) { dbgmsg("csocket<0. skip"); dbgmsg(csocket); continue; } if(caddr_size<=0) { dbgmsg("caddr_size<=0. skip"); dbgmsg(caddr_size); continue; } struct pthreadargs param; param.skt = csocket; param.cip = caddr.sin_addr.s_addr; char sTmp[100]; ip_int2str(param.cip, sTmp); dbgmsg("cip"); dbgmsg(sTmp); dbgmsg("caddr_size"); dbgmsg(caddr_size); pthread_t thread_id; pthread_create(&thread_id, NULL, &processRequest, ¶m); } close(lsocket); return 0; } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Seyon Опубликовано 3 апреля, 2007 Жалоба Поделиться Опубликовано 3 апреля, 2007 Ошибки реализации протокола? У тебя критичное на время соединения программа? Если нет, то в топку его На каждый баг поставить заплатку. Типа, самое первое подключение организовать к самому себе, а при ошибке ресива запускать заново Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.