我有一个应用程序正在侦听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;
}
来读取它们这可能是你想要的。但是,我仍然很困惑:你不能将一个TCP套接字句柄连接到2个端口。 – Femi 2011-05-04 22:34:49
真的吗?我想知道,当我读到这个问题时,我不确定这是否可能。现在我知道;) – Marlon 2011-05-04 22:36:26
谢谢,我有我的ListeningSocket全局声明,所以第一个ListeningSocket重新分配第二个。现在我为每个端口获得2个不同的套接字。这是我的问题。但是,我仍然必须使用select()作为某人建议?或者我可以为每个端口只有一个线程? – emge 2011-05-04 22:45:48