LINUX.ORG.RU

Неполучается слушать сокет на порту возврашенном системой


0

0

Добрый день!

Хочу получить в системе свободный порт и слушать его. Вроде все делаю правильно, но не работает зараза. Сам искал ответ - не нашел. Никаких ошибок функции не возвращают, все вроде в порядке. Пытаюсь телнетом законеститься на порт который система мне дала - не получается. Вроде как стучусь на порт который ниче не слушает. Если ставлю любой, от балды порт - все ок.

Что я делаю непралильно?

Компилил \ запускал под FreeBSD.

#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <netinet/in.h> #include <unistd.h>

int main() { int s, t, len; struct sockaddr_in sa, sa1;

s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) return -1; memset((char*)&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(0); // Система должна выделить порт выше 1024 sa.sin_addr.s_addr = INADDR_ANY; len = sizeof(sa); if (bind(s, (struct sockaddr *)&sa, sizeof(sa)) < 0) { printf("BIND ERROR\n"); return -1; } if (getsockname(s, (struct sockaddr *)&sa, (socklen_t *)&len) < 0) { printf("GETSOCKNAME\n"); return -1; } printf("port:%d\n", sa.sin_port); if (listen(s, SOMAXCONN) < 0) { printf("LISTEN\n"); return -1; } t = accept(s, (struct sockaddr *) &sa1, (socklen_t *)&len); close(s); if (t < 0) { printf("ACCEPT\n"); return -1; } close(t); }

Отформатируй пост по-нормальному. Если хочешь, чтобы к тебе проявили уважение и нормально ответили, а не в ман послали, прояви уважение - прочитай текст перед отправлением и проверь после.

unnamed
()
Ответ на: комментарий от unnamed

Вот, просто хотел ещё раз посмотреть, как работает indent ;) читать/разбираться/отвечать лень, так может хоть этим помогу

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <unistd.h>

int
main ()
{
  int s, t, len;
  struct sockaddr_in sa, sa1;

  s = socket (AF_INET, SOCK_STREAM, 0);
  if (s < 0)
    return -1;
  memset ((char *) &sa, 0, sizeof (sa));
  sa.sin_family = AF_INET;
  sa.sin_port = htons (0);	// Система должна выделить порт выше 1024
  sa.sin_addr.s_addr = INADDR_ANY;
  len = sizeof (sa);
  if (bind (s, (struct sockaddr *) &sa, sizeof (sa)) < 0)
    {
      printf ("BIND ERROR\n");
      return -1;
    }
  if (getsockname (s, (struct sockaddr *) &sa, (socklen_t *) & len) < 0)
    {
      printf ("GETSOCKNAME\n");
      return -1;
    }
  printf ("port:%d\n", sa.sin_port);
  if (listen (s, SOMAXCONN) < 0)
    {
      printf ("LISTEN\n");
      return -1;
    }
  t = accept (s, (struct sockaddr *) &sa1, (socklen_t *) & len);
  close (s);
  if (t < 0)
    {
      printf ("ACCEPT\n");
      return -1;
    }
  close (t);
}

erDiZz
()
Ответ на: комментарий от erDiZz

      printf ("LISTEN\n");
      return -1;
    }
  len = sizeof(struct sockaddr);
  t = accept (s, (struct sockaddr *) &sa1, (socklen_t *) & len);
  close (s);

Кажется нужно len инициализировать. Попробуйте.

Legioner ★★★★★
()
Ответ на: комментарий от kosmonavt

Нашел трабл, зашел сказать, что вопрос снимается. В любом случае спасибо за помощь.

Evgeniy211
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.