Winsock错误1013-权限被拒绝

Winsock错误1013-权限被拒绝,c,sockets,permission-denied,winsock2,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;

我正在尝试使用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;
}
经过一些研究,我发现这意味着这是一个权限被拒绝的错误。 我尝试查找一些修复程序,例如以管理员身份运行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和socket编程一无所知。

我已经尝试过你的代码,我可以用它连接到其他机器。我做了一些修改,因为我手头没有运行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
所以基本上你的实现是正确的

这意味着周围还有其他的小精灵!10013的错误是:

WSAEACCES
10013 (0x271D)
An attempt was made to access a socket in a way forbidden by its access permissions.
这可能是由防病毒软件或防火墙软件引起的。因此,请尝试禁用防火墙和防病毒,然后再次运行应用程序


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

在使用服务器结构之前,您应该先将sockaddr_归零,否则我不明白您的意思(我是C新手)?我应该写什么代码?memset(server,0,sizeof server);我在“server.sin_addr.s_addr=inet_addr(“74.125.235.20”);”之前尝试过:“memset(&server,0,sizeof server);”,但这解决不了任何问题!服务器本身就给了我一个编译时错误!他当时可能会收到拒绝的连接,但10013是WSAEACCESS,是常见的原因谢谢,但正如我在问题中所说的,我已经禁用了我的卡巴斯基,但毫无用处。根据第一手经验,我知道,尤其是卡巴斯基会坚持保护你(即使关闭)…那么我该如何关闭它呢?我会尝试的一件事是在启动后关闭自动启动。此外,您还可以添加规则以允许您的程序执行某些操作(但由于您的程序在开发过程中会发生更改,因此在每次构建之后,您可能需要一个新的规则)。最后一个残酷的方法是拆除它。此外,请确保已禁用Windows防火墙。
WSAEACCES
10013 (0x271D)
An attempt was made to access a socket in a way forbidden by its access permissions.