Какой самый простой способ записать IP-адрес из программы на C? - PullRequest
1 голос
/ 26 апреля 2011

Я обновляю программу фильтра, написанную на C. Программа предназначена для получения потока данных от последовательного порта, слегка ее изменив;затем отправьте его на IP-адрес беспроводного туннеля TCP-RS485.В настоящее время программа использует перенаправление ввода / вывода из сценария оболочки - оно вызывается так:

./packetfilter </dev/ttyS4 >/dev/tcp/10.0.50.101/4660  

Оболочка дает мне tcp / ip бесплатно.Теперь мне нужны и stderr, и stdout.
Какой самый простой способ записать мои последовательные данные в сетевой адрес?

Ответы [ 3 ]

3 голосов
/ 26 апреля 2011

Очень просто открыть сокет в C, но большая часть кода, который вы найдете, использует уродливые устаревшие методы, которые делают его сложным. Вот правильный путь:

struct addrinfo *ai;
int fd;
if (getaddrinfo(host_string, port_string, 0, &ai)) goto failed;
fd = socket(ai->ai_family, SOCK_STREAM, 0);
if (connect(fd, ai->ai_addr, ai->ai_addrlen)) goto failed2;

Заполните обработку ошибок.

1 голос
/ 26 апреля 2011

Вам нужно разделить IP-адрес на «точки» и сформировать 32-разрядное целое число (при условии, что вас беспокоит только IPV4 - если IPV6, у вас впереди еще много работы ...).

Каждый «пунктирный» номер станет одним байтом в вашем IP-адресе - так что в шестнадцатеричном ваш адрес в примере станет 0x0A003265

(0x0A = 10, 00 = 0, 0x32 = 50, 0x65 = 101, если я не облажался)

Затем передайте 32-битное целое число через функцию htons, чтобы она была помещена «в правильном» (сетевом) порядке (htons преобразуется из байтового порядка хоста в сеть). Вставьте результат в гнездо, и все готово.

0 голосов
/ 26 апреля 2011

Перенаправить на более высокий FD, затем использовать write(2).

./packetfilter </dev/ttyS4 3>/dev/tcp/10.0.50.101/4660  
...