C++ Windows中的原始套接字

4

我希望在Visual C++中使用原始套接字(RAW Socket)

我在Linux上看到了一个函数,它是:

int out = socket(AF_INET, SOCK_RAW, htons(ETH_P_ALL));

使用这段代码在 Linux 上可以实现,但是在 Windows 平台上如何使用原始套接字呢?因为当我在 Visual C++ 中使用时出现了错误。
提前感谢。
编辑:
int out1 = socket(AF_INET, SOCK_RAW, IPPROTO_SCTP);
for (; ;)
{
    int bytesIn = recvfrom(out1, buf, 2000, 0, (sockaddr*)&server, &serverLength);
    if (bytesIn == SOCKET_ERROR)
    {
        cout << "Error Receving from Server" << WSAGetLastError() << endl;
    }
    else
    {
        cout << "MESSAGE RECV from Server " << " : " << bytesIn << endl;
    }
}

这是我用来接收数据包的代码。

所以,你遇到了一个错误。你想详细说明一下吗?是什么错误? - harper
没有所谓的“C++ Windows”,但不同的Windows版本中有不同的NDIS实现。如果不知道你使用的是哪个版本,你就会迷失方向。 - harper
1个回答

4
在Windows中,最接近的等效物是SOCK_RAW,您需要使用一种技术使您的代码跨平台兼容。
例如,使用宏并将基础泛型虚拟类扩展为Windows派生类和Linux派生类,对于Windows使用WSAPROTOCOL,对于Linux使用POSIX库。
这里是一个关于如何使用Winsock原始套接字的指南。这里是一个有关如何使用宏识别平台的答案how to identify platform with macros

关于SOCK_RAW还是跨平台代码?这两个主题都比较广泛。您能展示一些您现有的代码吗? - Attersson
感谢您提供的链接和指导,先生。 - Chandrapal Singh Jhala
很高兴能帮忙。Windows和Linux非常不同,通常需要使用不同的实现(库)来创建两个版本的代码或者使用宏编译其中的一部分或另一部分的一个版本。 - Attersson
实际上,服务器就是相机,它不断向我的PC的IP地址发送原始数据包,我不想发送任何东西,所以我应该像教程中所示创建一个头吗? - Chandrapal Singh Jhala
@ChandrapalSinghJhala,不存在所谓的原始数据包。RAW并不是一种协议。我想您可能误解了相机实际发送的内容。例如,它可能会发送包含RAW图像数据的UDP数据包。RAW套接字和RAW图像数据是两个完全不同且无关的事物。 - Remy Lebeau
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接