C++Builder XE2,接收tcp请求

C++ Builder XE2, receiving tcp requests

本文关键字:tcp 请求 接收 XE2 C++Builder      更新时间:2023-10-16

我想在我的应用程序中编写一个tcp侦听器,这样它就可以由其他应用程序控制。

为此,我使用了我找到的以下片段(作为使用listener的示例(。

我曾经在C#中使用过p2p连接和套接字。NET,但这要么是很久以前的事,要么是太不同了。我希望代码在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: %dn", 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: %ldn", 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 %dn", WSAGetLastError());
        iResult = closesocket(ListenSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error %dn", 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: %dn", WSAGetLastError());
    wprintf(L"Listening on socket...n");
    iResult = closesocket(ListenSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error %dn", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    WSACleanup();
    return 0;
}

我希望代码在listen((命令处停止并等待,直到该端口出现连接请求

没有。你想到的是accept()listen()仅打开端口,然后立即退出。然后,您必须在循环中使用accept()来接受各个客户端连接。它返回一个新的SOCKET,用于与特定客户端交换数据。您可以在调用accept()之前使用select()来知道新客户端何时尝试连接,也可以让accept()阻塞调用线程,直到客户端连接为止。

您不应该编写自己的socket API代码,而应该使用预先存在的TCP服务器组件,如VCL的原生TServerSocket组件或Indy的TIdTCPServer组件。