2011-05-04 46 views
0

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

回答

1

什麼?您正在偵聽的端口號將不會與您的遠程對等端將您發送數據包的端口號相同。你必須記住你接受連接的端口號。

如果您想要獲取您和您的對等方正在使用的端口號,請嘗試使用getpeername

+1

來讀取它們這可能是你想要的。但是,我仍然很困惑:你不能將一個TCP套接字句柄連接到2個端口。 – Femi 2011-05-04 22:34:49

+0

真的嗎?我想知道,當我讀到這個問題時,我不確定這是否可能。現在我知道;) – Marlon 2011-05-04 22:36:26

+0

謝謝,我有我的ListeningSocket全局聲明,所以第一個ListeningSocket重新分配第二個。現在我爲每個端口獲得2個不同的套接字。這是我的問題。但是,我仍然必須使用select()作爲某人建議?或者我可以爲每個端口只有一個線程? – emge 2011-05-04 22:45:48

0

如果您使用recvfrom()讀取分組數據可以提取插座信息,其中包括端口信息。你如何閱讀數據包?

編輯:其實,等一下。你怎麼能爲這兩個接收相同的ListeningSocket?這是不可能的:你不能有一個套接字綁定到2個端口。

+0

我正在通過調用recv() – emge 2011-05-04 22:31:23

0

單個套接字不能同時在多個端口上偵聽。每次調用時,您的WS_SetUpListener()函數都會分配一個新的偵聽套接字。除非您在創建新的偵聽套接字之前關閉先前的偵聽套接字,否則您不應該多次獲得相同的套接字句柄。這將允許套接字API重用以前的句柄,如果它想。

相關問題