我正在升级用C编写的过滤程序。该程序用于从串口接收数据流,稍微修改一下;然后将其发送到tcp到rs485无线隧道的ip地址。目前,该程序依赖于shell脚本的i / o重定向 - 它的引发方式如下:
./packetfilter </dev/ttyS4 >/dev/tcp/10.0.50.101/4660
shell免费提供tcp / ip。现在我需要stderr和stdout 将串行数据写入网络地址的最简单方法是什么?
答案 0 :(得分:3)
在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 :(得分:1)
你需要将IP地址拆分为“点”,并形成一个32位整数(假设你只担心IPV4 - 如果是IPV6,你还有更多的工作......)。 / p>
每个“点”数将成为你的IP地址中的一个字节 - 所以在十六进制中,你的示例中的地址将变为0x0A003265
(0x0A = 10,00 = 0,0x32 = 50,0x65 = 101,如果我没搞砸的话)
然后传递32位整数throputh htons函数,使其按“正确”(网络)顺序放置(htons从主机转换为网络字节顺序)。将结果插入您的插座,您就已经完成了设置。
答案 2 :(得分:0)
重定向到更高的FD,然后使用write(2)
。
./packetfilter </dev/ttyS4 3>/dev/tcp/10.0.50.101/4660