gpt4 book ai didi

C++ Builder XE2,接收 tcp 请求

转载 作者:行者123 更新时间:2023-11-28 02:49:19 25 4
gpt4 key购买 nike

我想在我的应用程序中编写一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com