我有一个正在监听 2 个端口的应用程序,看起来当我调用我的函数时 WS_SetUpListener(参见下面的代码)具有 2 个不同的端口,我为这两个端口收到相同的 ListeningSocket,因此当数据包到达这 2 个端口中的任何一个时,我如何知道它被发送到哪个端口?
我按如下方式调用该函数:
ListeningSocket = WS_SetUpListener(port);
其代码是:
SOCKET WS_SetUpListener(int port)
{
char port_buf[20] = {0};
struct addrinfo *result = NULL, hints;
SOCKET ListenSocket = INVALID_SOCKET;
//char recvbuf[DEFAULT_BUFLEN];
int iResult;
//int iSendResult;
int recvbuflen = DEFAULT_BUFLEN;
sprintf_s(port_buf, sizeof(port_buf), "%d", port);
ZeroMemory(&hints, sizeof (hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the local address and port to be used by the server
iResult = getaddrinfo(NULL, port_buf, &hints, &result);
if (iResult != 0)
{
printf("getaddrinfo failed: %d\n", iResult);
return INVALID_SOCKET;
}
// Create a SOCKET for the server to listen for client connections
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET)
{
printf("***ERROR*** at socket(): %ld\n", WSAGetLastError());
freeaddrinfo(result);
return INVALID_SOCKET;
}
// Set up the TCP listening socket
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR)
{
printf("bind failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
return INVALID_SOCKET;
}
freeaddrinfo(result);
iResult = listen(ListenSocket, SOMAXCONN);
if ( iResult == SOCKET_ERROR )
{
printf( "Error at bind(): %ld\n", WSAGetLastError() );
closesocket(ListenSocket);
return INVALID_SOCKET;
}
return ListenSocket;
}
最佳答案
什么?您正在监听的端口号将与远程对等方向您发送数据包的端口号不同。您必须记住您接受连接的端口号。
如果您想获取您和您的同伴正在使用的端口号,请尝试使用 getpeername
。
关于c - 如果我用一个监听套接字监听 2 个端口,我如何知道哪个端口收到了数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890524/