如果我正在使用一个侦听套接字监听2个端口,如何判断哪个端口收到了数据包?

时间:2011-05-04 22:18:41

标签: c windows sockets

我有一个正在侦听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;
 }

4 个答案:

答案 0 :(得分:1)

什么?您正在侦听的端口号与远程对等方将向您发送数据包的端口号不同。您必须记住您接受连接的端口号。

如果您想获取您和您的同伴正在使用的端口号,请尝试使用getpeername

答案 1 :(得分:0)

您可以使用select()例程以及fdset和fdisset宏。

Differentiating Between Sockets using Select

答案 2 :(得分:0)

如果您使用recvfrom()读取数据包数据,则可以提取套接字信息,其中包括端口信息。你是如何阅读数据包的?

编辑:实际上,等一下。你怎么能同时收到相同的ListeningSocket?这是不可能的:你不能将一个套接字绑定到2个端口。

答案 3 :(得分:0)

单个套接字不可能同时侦听多个端口。您的WS_SetUpListener()函数每次调用时都会分配一个新的侦听套接字。除非在创建新的侦听套接字之前关闭先前的侦听套接字,否则不应多次获取相同的SOCKET句柄。这将允许套接字API在需要时重用前一个句柄。