C++ Builder XE2,接收 tcp 请求

标签 c++ sockets tcp c++builder

我想在我的应用程序中编写一个 tcp-listener,以便它可以被其他应用程序控制。

为此,我使用了我找到的以下代码片段(作为使用监听器的示例)。

我曾经在 C#.NET 中使用过 p2p-connections 和 Sockets,但它不是太久以前就是太不同了。我希望代码在 listen() 命令处停止并等待,直到该端口有连接请求。但是,它只是继续下一行。通常我的防火墙也应该告诉我,如果有一些互联网事件尝试,但它保持沉默。

真正知道是否有连接请求的下一步是什么? 我可以使用浏览器通过 127.0.0.1:27015 的 HTTP 请求触发它吗? 或者这可以更容易地存档吗?

#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")

int portlisten(){
    WSADATA wsaData;
    int iResult = 0;

    SOCKET ListenSocket = INVALID_SOCKET;
    sockaddr_in service;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup() failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for incoming connection requests.
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr("127.0.0.1");
    service.sin_port = htons(27015);

    iResult = bind(ListenSocket, (SOCKADDR *) & service, sizeof (service));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"bind function failed with error %d\n", WSAGetLastError());
        iResult = closesocket(ListenSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests
    // on the created socket
    if (listen(ListenSocket, 5) == SOCKET_ERROR)
        wprintf(L"listen function failed with error: %d\n", WSAGetLastError());

    wprintf(L"Listening on socket...\n");

    iResult = closesocket(ListenSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}

最佳答案

I expect the code to stop at the listen() command and wait until there is a connection request at that port.

没有。您正在考虑 accept()listen() 只是打开端口然后立即退出。然后,您必须在循环中使用 accept() 来接受各个客户端连接。它返回一个新的 SOCKET,您可以使用它与特定客户端交换数据。在调用 accept() 之前,您可以使用 select() 了解新客户端何时尝试连接,或者您可以让 accept() 阻塞调用线程,直到客户端连接。

与其编写自己的套接字 API 代码,不如使用预先存在的 TCP 服务器组件,例如 VCL 的 native TServerSocket 组件,或 Indy 的 TIdTCPServer 组件。

关于C++ Builder XE2,接收 tcp 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416499/

相关文章:

sockets - 关于 TCP 连接和 TCP 保持事件的查询?

java - 如何在服务器端为端口编写重试策略以监听客户端请求?

python - TCP 非阻塞 socket.connect() 和 socket.recv() 错误问题。 (Python 或 C)

multithreading - Thread.Sleep() 和 Thread.SpinWait() 有什么区别

c++ - 将更改限制为最大金额

c++ - 带有指针的错误 LNK2019

c++ - 每次迭代后更新帧

c# - 使数据接收/数据监听器保持事件状态的最佳方法是什么?

c++ - 我可以通过 for_each <algorithm> 在 C++ 中的指针 vector 上调用 `delete` 吗?

c++ - 带有编译时键或类型作为键的字典