我有一個應用程序正在偵聽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