【发布时间】: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 个服务器获取信息