C++ sendto失败,错误代码为10013的非管理员用户

C++ sendto失败,错误代码为10013的非管理员用户,c++,windows,sockets,C++,Windows,Sockets,我发现了更多像ping一样工作的源代码。我唯一的问题是,如果我使用非管理用户运行程序,那么我会返回错误代码10013,这意味着:“试图以其访问权限所禁止的方式访问套接字。”如果我使用管理员组成员的用户运行程序,那么它工作正常 nResult = sendto (sock, pSendBuffer, sizeof (ICMPheader) + nMessageSize, 0, (SOCKADDR *)&dest, sizeof (SOCKADDR_IN)); ::Get

我发现了更多像ping一样工作的源代码。我唯一的问题是,如果我使用非管理用户运行程序,那么我会返回错误代码10013,这意味着:“试图以其访问权限所禁止的方式访问套接字。”如果我使用管理员组成员的用户运行程序,那么它工作正常

nResult = sendto (sock, pSendBuffer, sizeof (ICMPheader) + nMessageSize, 0, (SOCKADDR *)&dest, sizeof (SOCKADDR_IN));  
        ::GetSystemTime (&timeSend);  
        ++nPacketsSent;  
        if (nResult == SOCKET_ERROR)  
        {    
        cerr << endl << "An error occured in sendto operation: "  << "WSAGetLastError () = " << WSAGetLastError () << endl;  
                  }  
nResult=sendto(sock,pSendBuffer,sizeof(ICMPheader)+nMessageSize,0,(SOCKADDR*)和dest,sizeof(SOCKADDR_IN));
::GetSystemTime(&timeSend);
++npacktssent;
如果(nResult==套接字错误)
{    

cerr是您的插座类型
SOCK\u RAW
?在这种情况下,这是设计:


您的插座是
SOCK_RAW
类型的吗?在这种情况下,这是设计的:


您的代码是否使用原始套接字?如果此代码确实实现了PING请求,那么它应该使用原始套接字


由于安全考虑(考虑这些考虑的人没有考虑很多,但这是另一个职位),原始套接字仅可用于具有管理员权限的帐户。

您的代码是否使用原始套接字?如果此代码确实实现了PING请求,则应使用原始套接字



由于安全考虑(考虑这些考虑的人没有考虑很多,但这是另一个职位),原始套接字仅对具有管理员权限的帐户可用。

如果要在Windows上的应用程序中实现ping功能,则应查看该功能,而不是尝试使用原始套接字。

如果要在Windows上的应用程序中实现ping功能,则应我们来看看这个函数,而不是尝试使用原始套接字。

因此,可以发出“ping”只有当管理员的时候才能使用命令?看起来这个世界有点正常differently@Rom:在Linux下,ping由root所有,并设置了setuid位,这样原始套接字就可以为任何人工作。在Windows下,它取决于您的Windows和ServicePack版本。我认为Windows采用了类似的方法使其工作…@Malkocoglu:no需要管理员才能运行“ping”命令的Windows版本/service pack。Windows中没有等效的“setuid”标志,因为Windows上的安全性是在用户级别实现的(程序拥有运行它们的用户的权限)。请注意,问题的答案是“Windows” tag@Rom:cmeerw的答案是正确的。我刚刚反汇编了ping.exe,发现它首先尝试查找/执行上述函数,如果不成功,它会创建一个原始套接字并手动执行ping。因此,事实上,行为会因Windows版本而改变……IcmpSendEcho2是IPHelper API的一部分,它看起来像是一个应用程序的接口系统服务(还管理ARP、DHCP、路由…)。这解释了为什么此函数调用对所有用户都可用,而不是原始套接字。是的,行为会根据Windows版本而变化:原始套接字出现在2001年左右,ping很久以前就存在了。因此,换句话说,可以发出“ping”只有当管理员的时候才能使用命令?看起来这个世界有点正常differently@Rom:在Linux下,ping由root所有,并设置了setuid位,这样原始套接字就可以为任何人工作。在Windows下,它取决于您的Windows和ServicePack版本。我认为Windows采用了类似的方法使其工作…@Malkocoglu:no需要管理员才能运行“ping”命令的Windows版本/service pack。Windows中没有等效的“setuid”标志,因为Windows上的安全性是在用户级别实现的(程序拥有运行它们的用户的权限)。请注意,问题的答案是“Windows” tag@Rom:cmeerw的答案是正确的。我刚刚反汇编了ping.exe,发现它首先尝试查找/执行上述函数,如果不成功,它会创建一个原始套接字并手动执行ping。因此,事实上,行为会因Windows版本而改变……IcmpSendEcho2是IPHelper API的一部分,它看起来像是一个应用程序的接口系统服务(还管理ARP、DHCP、路由…)。这就解释了为什么与原始套接字相反,此函数调用对所有用户都可用。是的,行为会根据Windows版本而变化:原始套接字出现在2001年左右,ping早就出现了。你是对的!这会容易得多,但我需要icmplib.lib使用ICMPSendEcho2编译程序,但我找不到icmplib.lib你知道我在哪里可以得到它吗?谢谢是advance!你是说iphlapi.lib吗?这应该包括在你的编译器中(当然是在Visual Stdio 2008中)。或者,你可以下载Windows SDK(请参阅)不,我的意思是icmplib.lib。但这是我的错误:)我通常使用未识别ICMPSendEcho2的Dev-C++,因为它需要icmplib.lib,但我找不到,所以我用Visual Studio编译,而这个不需要icmplib.lib。我的错误,对不起:)你是对的!这会更容易,但我需要icmplib.lib来编译我的程序我使用的是ICMPSendEcho2,但是我在任何地方都找不到icmplib.lib。你知道我在哪里可以得到它吗?感谢是advance!你是说IPHLAPI.lib?这应该包含在你的编译器中(当然是Visual Stdio 2008)。或者,你可以下载Windows SDK(请参阅)不,我的意思是icmplib.lib。但这是我的错误:)我通常使用的Dev-C++没有识别ICMPSendEcho2,因为它需要icmplib.lib,但我找不到,所以我用Visual Studio编译,而这个不需要icmplib.lib。我的错误,对不起:)