Winsock错误1013-权限被拒绝

时间:2014-10-23 16:47:12

标签: c sockets permission-denied winsock2

我试图使用C:

运行下面的简单程序
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

#pragma comment (lib, "Ws2_32.lib")

int main(int argc, char **argv)
{
    int iResult;
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;

    printf("Initialising Winsock...\n");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        getchar();
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
        getchar();
    }

    printf("Socket created.\n");


    server.sin_addr.s_addr = inet_addr("74.125.235.20");
    server.sin_family = AF_INET;
    server.sin_port = htons(80);

    //Connect to remote server
    iResult = connect(s, (struct sockaddr *)&server, sizeof (server));
    if (iResult == SOCKET_ERROR)
    {
        printf("Connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(s);
        if (iResult == SOCKET_ERROR)
            printf("closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        getchar();
        return 1;
    }
    printf("Connected");
    getchar();
    return 0;
}

这基本上是一个C程序,它创建一个套接字并与Google建立连接。 (我只是按照教程:http://www.binarytides.com/winsock-socket-programming-tutorial,因为我完全不熟悉套接字编程。)

现在我的程序输出:

Initialising Winsock...
Initialised.
Socket Created.
Connect function failed with error: 10013

经过一番研究后,我发现这意味着这是一个权限被拒绝的错误。 我尝试寻找一些修复程序,例如以管理员身份运行Visual Studio Express并在命令提示符下运行这些命令:

netsh winsock reset catalog
netsh int ip reset reset.log hit

然后重新启动我的电脑,但它仍无效。

当我运行第二个命令时值得一提:netsh int ip reset reset.log hit我收到以下错误信息:

Resetting , failed.
Access is denied.
There's no user specified settings to be reset.

即使我以管理员身份运行命令提示符。

我也暂时取消了我的卡巴斯基互联网安全功能,但仍无法修复。我是C和套接字编程的新手。

1 个答案:

答案 0 :(得分:0)

我已经尝试过你的代码,我可以用它来连接其他机器。我做了一点修改,因为我现在没有运行HTTP服务器的机器。因此我使用www.google.com:

struct sockaddr_in server;
remoteHost = gethostbyname("www.google.com");   // get IP of www.google.com
server.sin_addr.s_addr = *((unsigned long *)remoteHost->h_addr);  // inet_addr("74.125.235.20");
server.sin_family = AF_INET;
server.sin_port = htons(80);

您的应用程序的输出是:

Initialising Winsock...
Initialised.
Socket created.
Connected

所以基本上你的实现是正确的。

这意味着周围还有一些其他的gremlin!错误10013的MSDN description是:

WSAEACCES
10013 (0x271D)
An attempt was made to access a socket in a way forbidden by its access permissions.

这可能是由防病毒软件或防火墙软件引起的。因此,请尝试禁用防火墙和防病毒并再次运行应用程序。

如果可行,请尝试查找可能会阻止您的应用程序连接的防火墙/防病毒设置。这可能是一个相当严峻的考验(我知道我在说什么)......