C++Builder XE2,接收tcp请求
C++ Builder XE2, receiving tcp requests
我想在我的应用程序中编写一个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
组件。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 如何在boost beast http请求中设置http头
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 发送一个带有libcurl C++问题的帖子请求:s
- 在多个核心中处理一个HTTP请求
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 通过TCP的PvP通信问题
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 每个服务器请求的内存预算
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 如何知道请求是否完全使用 TCP 套接字接收?
- 如何使用 recv 或 C++ 中的读取功能从 tcp 套接字读取大请求
- 其他数据以及 TCP 连接请求
- 模拟器,发送请求 - 响应并打开TCP连接
- C++Builder XE2,接收tcp请求