c - 如果我用一个监听套接字监听 2 个端口,我如何知道哪个端口收到了数据包?

标签 c windows sockets

我有一个正在监听 2 个端口的应用程序,看起来当我调用我的函数时 WS_SetUpListener(参见下面的代码)具有 2 个不同的端口,我为这两个端口收到相同的 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;
 }

最佳答案

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

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

关于c - 如果我用一个监听套接字监听 2 个端口,我如何知道哪个端口收到了数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5890524/

相关文章:

sockets - 有没有一种方法可以将Docker套接字从一个容器安装到另一个容器?

c - 正确传输客户端-服务器套接字连接中的文件

sockets - Boost 中的单线程服务器

c - 在C中的int数组中查找数字的频率

c - 如何在 C 语言中将空格分隔的文本行重新格式化为单独的 <div> 标记?

java - Windows 上的 log4j2 RollingFile 给出 "The system cannot find the path specified"

python - 我在 Windows 7 上安装了 Python 3.4.3 而不是 3.4.2...现在我无法卸载 Python

在 C 中将毫秒转换为秒

c - 如何以编程方式向 QEMU guest 发送键盘事件?

javascript - 使用 Windows PowerShell 传递 Node.js 环境变量