【问题标题】:C++ winsock TCP listeningC++ winsock TCP 监听
【发布时间】: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函数代替bindrecv而不是accept。非常感谢!

标签: c++ sockets networking tcp winsock


【解决方案1】:

这是正确的代码:

WSADATA WSAData;
WSAStartup(MAKEWORD(2, 0), & WSAData);

SOCKET sock;
SOCKADDR_IN socket_in;
InetPton(AF_INET, "127.0.0.1", & socket_in.sin_addr.s_addr);
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(47806);
sock = socket(AF_INET, SOCK_STREAM, 0);
connect(sock, (SOCKADDR*)& socket_in, sizeof(socket_in));

int valid = 0;
char buffer[512] = "";
while (TRUE) {
    valid = recv(sock, buffer, sizeof(buffer), 0);

    if (valid != INVALID_SOCKET) {
        std::cout << buffer;
    }
}

我的程序是客户端而不是服务器。所以我必须用InetPton定义一个IP地址,用connect连接到服务器,用recv接收消息。

感谢@Hasturkun 和@RustyX 的帮助和解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多