我有一个正在侦听2个端口的应用程序,看来当我调用我的函数时 WS_SetUpListener(见下面的代码)有两个不同的端口,我收到两个相同的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;
}
答案 0 :(得分:1)
什么?您正在侦听的端口号与远程对等方将向您发送数据包的端口号不同。您必须记住您接受连接的端口号。
如果您想获取您和您的同伴正在使用的端口号,请尝试使用getpeername
。
答案 1 :(得分:0)
您可以使用select()例程以及fdset和fdisset宏。
答案 2 :(得分:0)
如果您使用recvfrom()
读取数据包数据,则可以提取套接字信息,其中包括端口信息。你是如何阅读数据包的?
答案 3 :(得分:0)
单个套接字不可能同时侦听多个端口。您的WS_SetUpListener()
函数每次调用时都会分配一个新的侦听套接字。除非在创建新的侦听套接字之前关闭先前的侦听套接字,否则不应多次获取相同的SOCKET句柄。这将允许套接字API在需要时重用前一个句柄。