C++ winsock TCP监听

标签 c++ sockets networking tcp winsock

我有一个软件可以解码 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”,但实际上并没有。 我可以使用 PuTTY 等 Telnet 软件读取数据: PuTTY telnet on port 47806

我不明白为什么我的代码不起作用。

最佳答案

这是正确的代码:

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 的帮助和解释。

关于C++ winsock TCP监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187913/

相关文章:

c++ - 由于 vector.push_back() 导致执行过早结束 [C++]

c++ - 使用单例存储全局应用程序参数

windows - 戈朗 : winapi call with struct parameter

c - 为什么 getaddrinfo() 在函数的输入部分返回一个值?

ios - 应用程序启动时更改核心数据

c++ - 赋值语句截断字符

c++ - C++ 中谓词的逻辑否定

java - 使用 Java 连接到 FTP

linux - 内核中的 sock_create()

node.js - 尝试运行 socket.io 示例时出现跨源请求被阻止错误