Перейти к содержанию

Странные баги с сокетами в простейшей проге


Рекомендуемые сообщения

Кто нибудь сталкивался с нижеследующими ошибками. Приведен код, элементарный, почти целиком взят из примеров.

Обнаружились следующие странные ошибки:

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, &param);
}

close(lsocket);

return 0;
}

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Ошибки реализации протокола?

У тебя критичное на время соединения программа? Если нет, то в топку его Smile На каждый баг поставить заплатку. Типа, самое первое подключение организовать к самому себе, а при ошибке ресива запускать заново Smile

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...