Кто нибудь сталкивался с нижеследующими ошибками. Приведен код, элементарный, почти целиком взят из примеров.
Обнаружились следующие странные ошибки:
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;
}