【问题标题】:multi usage of udp port on c++ / use port multi time on c++ server在 C++ 上多次使用 udp 端口​​/在 C++ 服务器上多次使用端口
【发布时间】:2021-05-03 19:29:50
【问题描述】:

我想问一下如何将端口用于 2 个应用程序

例如我有一个像teampeak服务器这样的程序使用端口9987(默认)

我有一个 c++ 代码来监听这个 udp 端口​​并查看数据包值

但问题是当我启动 teampeak 服务器时,我无法启动 c++ 代码得到错误 10048

这是我的代码

#include <iostream>
#include <WS2tcpip.h>

// Include the Winsock library (lib) file
#pragma comment (lib, "ws2_32.lib")

using namespace std; 

void main()
{
    WSADATA data;

    WORD version = MAKEWORD(2, 2);

    // Start WinSock
    int wsOk = WSAStartup(version, &data);
    if (wsOk != 0)
    {
        // Not ok! Get out quickly
        cout << "Can't start Winsock! " << wsOk;
        return;
    }

    SOCKET in = socket(AF_INET, SOCK_DGRAM, 0);

    sockaddr_in serverHint;
    serverHint.sin_addr.S_un.S_addr = ADDR_ANY; // Us any IP address available on the machine
    serverHint.sin_family = AF_INET; // Address format is IPv4
    serverHint.sin_port = htons(9987); // Convert from little to big endian
    int reuse = 1;
    setsockopt(in, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse));
    setsockopt(in, SOL_SOCKET, 15, (const char*)&reuse, sizeof(reuse));
    // Try and bind the socket to the IP and port
    if (bind(in, (sockaddr*)&serverHint, sizeof(serverHint)) == SOCKET_ERROR)
    {
        cout << "Can't bind socket! " << WSAGetLastError() << endl;
        return;
    }
    sockaddr_in client; // Use to hold the client information (port / ip address)
    int clientLength = sizeof(client); // The size of the client information

    char buf[1024];

    while (true)
    {
        ZeroMemory(&client, clientLength); // Clear the client structure
        ZeroMemory(buf, 1024); // Clear the receive buffer

        int bytesIn = recvfrom(in, buf, 1024, 0, (sockaddr*)&client, &clientLength);
        if (bytesIn == SOCKET_ERROR)
        {
            cout << "Error receiving from client " << WSAGetLastError() << endl;
            continue;
        }

        char clientIp[256]; // Create enough space to convert the address byte array
        ZeroMemory(clientIp, 256); // to string of characters

        inet_ntop(AF_INET, &client.sin_addr, clientIp, 256);
        cout << "Message recv from " << clientIp << " : " << buf << endl;
    }

    closesocket(in);
    WSACleanup();
}

我从 youtube 频道获取此代码并对其进行了一些编辑,但我厌倦了搜索

我在代码中的编辑是添加 SO_REUSEADDR 并添加 SO_REUSEPORT,其值为 15

有人可以帮忙吗?

【问题讨论】:

  • 首先要做的是查看错误代码 10048 的含义,以便您了解 youtube 视频告诉您的操作。接下来的事情可能是完全忽略 youtube 视频,它们中的大多数完全烂透了,但在你理解材料之前你不能打电话。
  • 你好 10048 表示套接字已被另一个应用程序使用,请提供更多帮助
  • 时髦。接下来的事情是找出您的 PC 上已经使用端口 9987 的内容。我使用来自Sysinternals called TCPView 的程序来列出打开的端口。一旦您了解了端口上的内容,您就可以开始决定下一步了。
  • 你好,我告诉你我需要从同一端口上的 2 个服务器获取信息

标签: c++ udp port


【解决方案1】:

对于 TCP 或 UDP,2 个单独的应用程序无法在同一地址上侦听同一端口,操作系统需要知道哪个应用程序要传递 UDP 数据包(或者在 TCP 的情况下哪个应用程序会接受连接)。例外是多播 UDP,但这是另一回事。如果您想拦截传递到现有应用程序的数据包,这是完全不同的任务并且要复杂得多。您可以使用现有的应用程序,如 Wireshark 或编写自己的应用程序 - 有关编写用于 windows 流量拦截的应用程序的详细信息可以在这里找到Making a program that intercepts network traffic in Windows

【讨论】:

  • 嘿,是的,我想用 C++ 创建一些东西来获取从客户端接收的数据包
  • @YousefAshraf 您需要进入内核级别,链接中对此进行了描述。我相信在 Linux 中更容易做到,但不是 100% 肯定。无论如何使用wireshark是最简单的。
  • 我需要创建一些控制数据包的软件,我不能使用程序来做到这一点,因为我尝试通过 c++ 来做到这一点
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 2017-12-18
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 2011-12-01
  • 2017-07-07
  • 2015-02-10
相关资源
最近更新 更多