2011-05-04 90 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重用以前的句柄,如果它想。

相关问题