Как Создать подключение сокета TCP с помощью C к предопределенному порту

Скорее всего, вы используете внутри предмета. Тогда вы можете сделать это

.item{
    --border-width: 0;
}
10
задан krabhishek 15 October 2008 в 09:37
поделиться

4 ответа

Вызов для привязки функции возвратится-1, если будет ошибка. Это включает случай, где адрес уже используется.

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 12345

int main()
{
  struct sockaddr_in addr;
  int fd;

  fd = socket(AF_INET, SOCK_STREAM, 0);
  if(fd == -1)
  {
      printf("Error opening socket\n");
      return -1;
  }

  addr.sin_port = htons(PORT);
  addr.sin_addr.s_addr = 0;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_family = AF_INET;

  if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
  {
      printf("Error binding socket\n");
      return -1;
  }

  printf("Successfully bound to port %u\n", PORT);
}
12
ответ дан 3 December 2019 в 21:24
поделиться

Это зависит немного от точно, что Вы пытаетесь протестировать.

Используя bind() в способе, которым предложенный joelc скажет Вам, если порт будет открыт в каком-либо интерфейсе на Вашей машине. Хотя быть полными, необходимо не только проверять возвращаемое значение от bind(), но также и проверка errno == EADDRINUSE.

т.е. (модификация кода joelc)


if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) == -1)
{
    if( errno == EADDRINUSE )
    {
        // handle port already open case
    }
    else
    {
        // handle other errors
    }
}

Путем изменения адреса использовал в строке: например.


    sin.sin_addr.s_addr = inet_addr("192.168.1.1");

... можно протестировать, доступен ли порт в определенном интерфейсе.

Знайте, хотя это это не идеальный тест для состояния порта. Если другой процесс имел открытый порт и был завершен, прежде чем он корректно закрыл порт (т.е. перед вызовом close() на сокете), затем Вы будете обычно получать то же EADDRINUSE ошибка. (в зависимости от того, была ли опция SO_REUSEADDR установлена на сокете),

(примечание стороны: если Ваше тестовое приложение не будет работать с необходимыми полномочиями, Вы не сможете связать () с любыми портами ниже 1024),

Как Анонимные предложенный, можно также взглянуть на netstat. Это даст Вам всю ту же информацию, которую можно, неоднократно продвигаться называя bind() намного более быстро и без любого из побочных эффектов (как он не должен на самом деле связывать с портами, которые сделали бы их неприменимыми к любым другим процессам). Просто вызов netstat -a --numeric-ports -t и анализ вывода должен дать Вам все, что Вы после.

Комментарий moogs предложение, хотя - вызов telnet на каждом порте только скажет Вам, если сокет послушает на том порте - не, открыто ли это на самом деле.

8
ответ дан 3 December 2019 в 21:24
поделиться

Вы просто хотите протестировать, если конкретный порт используется в настоящее время? (и не должны действительно делать программу). Если так, можно использовать telnet:

серверный порт telnet

Если связь прерывается, она не используется. Если это соединяется и ожидает входа от Вас, это используется :)

-1
ответ дан 3 December 2019 в 21:24
поделиться

Вы могли бы хотеть посмотреть на исходный код netstat. Я полагаю, что существует netstat в Солярисе также.

-2
ответ дан 3 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: