【发布时间】:2018-06-19 15:39:24
【问题描述】:
我有一个软件可以解码 ADS-B 消息(来自飞机)并将结果以十六进制形式发送到端口 (47806)。
我想监听这个端口来显示数据,所以我写了这个:
WSADATA WSAData;
WSAStartup(MAKEWORD(2, 0), & WSAData);
SOCKET sock;
SOCKADDR_IN socket_in;
socket_in.sin_addr.s_addr = htonl(INADDR_ANY);
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(47806);
sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (SOCKADDR*)& socket_in, sizeof(socket_in));
listen(sock, 0);
int valid = 0;
while (TRUE) {
int size_socket_in = sizeof(socket_in);
valid = accept(sock, (SOCKADDR*)& socket_in, & size_socket_in);
if (valid != INVALID_SOCKET) {
std::cout << "OK";
}
}
每次收到消息时,此代码都应显示“OK”,但事实并非如此。 我可以使用 Telnet 软件读取数据,例如 PuTTY: PuTTY telnet on port 47806
我不明白为什么我的代码不起作用。
【问题讨论】:
-
UDP 不是基于连接的,
listen()会失败,accept()也会失败。另外,telnet 是一个 TCP 服务。 -
@Hasturkun 我刚刚检查过
netstat,它实际上是一个 TCP 连接。所以我用新代码更新了我的帖子。谢谢 -
你把“听”的概念倒过来了;您的 ADS-B 进程侦听端口 47806,在您的客户端应用程序中,您只需连接到 localhost 端口 47806,您就会通过该连接将消息发送给您。
-
@RustyX 这是我第一次使用套接字,所以我有点迷茫。所以,我用
InetPton定义了IP地址,我使用connect函数代替bind和recv而不是accept。非常感谢!
标签: c++ sockets networking tcp winsock